gpt4 book ai didi

c++ - 将容器分成 block ,C++

转载 作者:IT老高 更新时间:2023-10-28 22:19:21 25 4
gpt4 key购买 nike

给定一个 vector N元素 v = ( 1, 2, 3, 4, ... , N )返回所有大小块的范围迭代器 K<N .最后一个范围可以小于 K如果 N%K!=0 .

例如:

v = ("a","b","c","d","e")

显示字符串

"ab", "cd", "e"

N=v.size();
K=2;

一种可能的解决方案是:

for( unsigned int i=0; i<v.size(); i+=K )
cout << boost::join( v | boost::adaptors::sliced( i, min(i+K, v.size()) ), "" );

这个解决方案还不错,但是有几个问题:

  1. for循环 - 需要吗?
  2. 如果你写 i+K而不是 min(i+K, v.size())算法粉碎,需要额外注意边界情况。这看起来很难看,而且会分散注意力。

你能提出更优雅的解决方案吗?优雅的解决方案是指使用通用算法,内置或由常用库(如 boost)提供。

-------------- [编辑] ------------------ --------

你们中的一些人不习惯工作示例,这里是。

#include <iostream>
#include <vector>
#include <string>
#include <boost/range/adaptor/sliced.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/assign.hpp> //just for fun

using namespace std;
using namespace boost::assign;

int main(int , char **)
{
const int K = 2;
vector< string > v;
v += "a","b","c","d","e";

for( unsigned int i=0; i<v.size(); i+=K )
cout << boost::algorithm::join(
v | boost::adaptors::sliced( i, min(i+K, v.size()) ), "" )
<< endl;
}

输出:

ab 
cd
e

最佳答案

我不知道它是否非常优雅,但是您可以使用带有标准函数 Advance 和 distance 的迭代器:

template<typename Iterator, typename Func, typename Distance>
void chunks(Iterator begin, Iterator end, Distance k ,Func f){
Iterator chunk_begin;
Iterator chunk_end;
chunk_end = chunk_begin = begin;

do{
if(std::distance(chunk_end, end) < k)
chunk_end = end;
else
std::advance(chunk_end, k);
f(chunk_begin,chunk_end);
chunk_begin = chunk_end;
}while(std::distance(chunk_begin,end) > 0);
}

关于c++ - 将容器分成 block ,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9942869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com