只移动Iterator一次

时间:2016-05-19 12:59:12

标签: c++ vector iterator initialization iteration

我正在努力寻找改善my answer here的方法。让我们简化要说的问题:我想将输入容器分区,让我们称之为foo,将vector的{​​{1}}大小vector分开,其中最后一个如果输入容器中剩余的STEP个元素少于vector个,STEP的大小会更小,让我们调用此分区容器bar

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

  1. 使用构造为bar vector
  2. min(STEP, distance(it, foo.end())附加it
  3. 在构建容器后,advance(it, size(bar.back()))指向vector
  4. 执行此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))); 施工
  5. 我对这个问题的回答的翻译是:

    bar.push_back(decltype(bar)::value_type(STEP))

    问题是这一行:vector我正在分配{{1}}和0初始化它的组件。有没有更好的方法来做到这一点,我仍然只会迭代输入和输出范围一次?

1 个答案:

答案 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()的表现,请随意使用计数器变量!