循环使用以第二个(或第n个)项开头的C++迭代器

use*_*493 12 c++ iterator coding-style readability

我正在寻找一种可读,优雅的方式在C++中执行以下操作,这里显示在Python中:

for datum in data[1:]:
    do work.
Run Code Online (Sandbox Code Playgroud)

有问题的数据上的迭代器可能不支持随机访问迭代器,所以我不能只使用:

for (mIter = data.begin() + 1; mIter != data.end(); mIter++)
Run Code Online (Sandbox Code Playgroud)

我提出的最好的是以下内容:

iterable::iterator mIter = data.begin();
for (mIter++;  mIter != allMjds.end(); mjdIter++) {
    do work.
}
Run Code Online (Sandbox Code Playgroud)

它不是太冗长,但它几乎不是说明性的 - 乍一看它实际上看起来像是一个错误!

另一种解决方案是拥有一个"第n个元素"辅助函数,我猜.任何冷静的想法?

ava*_*kar 23

您可以使用std::next(iter, n)线性时间推进.您也可以使用标准std::advance算法,虽然它不是那么简单(它使用非const引用的迭代器并且不返回它).

例如,

for (mIter = std::next(data.begin()); mIter != data.end(); ++mIter)
Run Code Online (Sandbox Code Playgroud)

要么,

mIter = data.begin();
std::advance(mIter, 1);
for (; mIter != data.end(); ++mIter)
Run Code Online (Sandbox Code Playgroud)

请注意,您必须确保data.size() >= 1,否则代码将以灾难性方式失败.

  • 值得注意的是,如果你有随机访问迭代器,那么`next`和`prior`是恒定时间. (4认同)

Ste*_*end 5

#include <iterator>

iterator iter = data.begin();
for (advance(iter, 1); iter != data.end(); ++iter)
{
  // do work
}
Run Code Online (Sandbox Code Playgroud)

但是,它依赖于> = 1元素data来避免异常.

  • 使用`advance`调用作为init语句,很好的触摸!:) +1 (3认同)
  • 你的意思是代码依赖于超过0个元素. (2认同)