c++ - 只移动迭代器一次

标签 c++ vector iterator initialization iteration

我正试图找到一种方法来改进 my answer here .让我们将问题简化为:我想将输入容器(我们称之为 foo)划分为 vectorvector 大小 STEP,如果输入容器中剩余的元素少于 STEP,则这些 vector 中的最后一个应具有较小的大小,让我们称之为分区容器 bar.

我不想多次迭代我的输入或输出范围。我要解决的问题的要素很简单:

  1. 使用大小为 min(STEP, distance(it, foo.end())
  2. 的构造 vector 附加bar
  3. 在构建容器后让it指向advance(it, size(bar.back()))
  4. 就地构建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 并 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/

相关文章:

c++ - 讨论-创建矩阵时 vector 的数组与 vector -最实用的选择是什么?

java - Java LinkedList 的 ConcurrentModificationException

c++ - istream_iterator eos

c++ - 从函数返回时错误 boost filtering_ostream

c++ - 如何使这个运算符(operator)调用明确?

C++ 结构排序错误

c++ - 为什么Xcode的默认代码生成错误?

c++ - std::vector push_back(Object()) 和 push_back(new Object()) 的区别?

Java List , Vector 比较

c# - 用于获取 2 个不同枚举的排列的最佳集合类型是什么