給定向量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