我正在寻找一种易于理解的,优雅的方法来在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个元素”辅助函数。有更酷的想法吗?

最佳答案

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

例如,

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,否则代码将以灾难性的方式失败。

07-27 13:42