从第二个(或第 n 个)项目开始循环 C 迭代器

新手上路,请多包涵

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

 for datum in data[1:]:
    # do work.

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

 for (mIter = data.begin() + 1; mIter != data.end(); mIter++)

我想出的最好的方法如下:

 iterable::iterator mIter = data.begin();
for (mIter++;  mIter != allMjds.end(); mjdIter++) {
    // do work.
}

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

我猜另一个解决方案是有一个“第 n 个元素”辅助函数。有没有更简洁的方法?

原文由 user511493 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 768
1 个回答

您可以使用 std::next(iter, n) 进行线性时间提前。您也可以使用标准 std::advance 算法,尽管它使用起来并不简单(它通过非常量引用获取迭代器并且不返回它)。

例如,

 for (mIter = std::next(data.begin()); mIter != data.end(); ++mIter)

或者,

 mIter = data.begin();
std::advance(mIter, 1);
for (; mIter != data.end(); ++mIter)

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

原文由 avakar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题