给定向量N
元素v = (1, 2, 3, 4, ... , N)
返回范围迭代器遍历所有大小为K<N
的块。如果N%K!=0
的最后范围可以小于K
。将容器划分为大块,C++
例如:
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())), "");
该解决方案是相当确定的,但它有几个问题:
for
循环 - 是否需要?- 如果您编写
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
你为什么不发表完整的例子? – 2012-03-30 12:35:16
@VJovic在示例中,我展示了我真正需要的东西,但这是更一般的问题,如何分别在容器的每个块上运行算法。 – bartek 2012-03-30 12:46:40
不幸的是,我不能编译你的例子,我失去了我的水晶球;) – 2012-03-30 13:12:49