我正在努力寻找改善my answer here的方法。让我们简化要说的问题:我想将输入容器分区,让我们称之为foo
,将vector
的{{1}}大小vector
分开,其中最后一个如果输入容器中剩余的STEP
个元素少于vector
个,STEP
的大小会更小,让我们调用此分区容器bar
。
我不想多次迭代输入或输出范围。我想解决的问题的元素很简单:
bar
vector
min(STEP, distance(it, foo.end())
附加it
advance(it, size(bar.back()))
指向vector
auto it = cbegin(foo);
for (auto i = size(foo); i > STEP; i -= STEP) {
bar.push_back(decltype(bar)::value_type(STEP));
for (auto internalIt = bar.back().begin(); internalIt != bar.back().end(); ++internalIt, ++it) {
*internalIt = *it;
}
}
bar.push_back(decltype(bar)::value_type(it, cend(foo)));
施工我对这个问题的回答的翻译是:
bar.push_back(decltype(bar)::value_type(STEP))
问题是这一行:vector
我正在分配{{1}}和0初始化它的组件。有没有更好的方法来做到这一点,我仍然只会迭代输入和输出范围一次?
答案 0 :(得分:1)
bar.push_back(decltype(bar)::value_type{}); // or bar.resize(bar.size() + 1); if you prefer
bar.back().reserve(STEP);
while (bar.back().size() < STEP) {
bar.back().push_back(*it);
++it;
}
当std::copy_n
返回高级输出迭代器时,运气不好,当你需要保留的是高级输入迭代器时,否则你可以用它来代替循环(使用std::back_inserter
来获取目标迭代器)。
如果您担心bar.back().size()
的表现,请随意使用计数器变量!