我正试图找到一种方法来改进 my answer here .让我们将问题简化为:我想将输入容器(我们称之为 foo
)划分为 vector
的 vector
大小 STEP
,如果输入容器中剩余的元素少于 STEP
,则这些 vector
中的最后一个应具有较小的大小,让我们称之为分区容器 bar
.
我不想多次迭代我的输入或输出范围。我要解决的问题的要素很简单:
- 使用大小为
min(STEP, distance(it, foo.end())
的构造 - 在构建容器后让
it
指向advance(it, size(bar.back()))
- 就地构建
vector
vector
附加bar
我对这个问题范围的回答的翻译是:
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
并 0 初始化它的组件.有没有更好的方法来做到这一点,在这种方法下我仍然只会迭代输入和输出范围一次?
最佳答案
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()
的性能,请随意使用计数器变量!
关于c++ - 只移动迭代器一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37323952/