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

问题描述 投票:13回答:6

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

c++ coding-style iterator readability
6个回答
23
投票

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

例如,

std::advance

std::advance

请注意,您必须确保for (mIter = std::next(data.begin()); mIter != data.end(); ++mIter) ,否则代码将以灾难性的方式失败。


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

不过,这依赖于data.size() >= 1中的> = 1个元素来避免发生异常。


2
投票

您可以尝试:

#include <iterator>

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

但是您需要确保如果data执行for (mIter = data.begin() ; ++mIter != data.end() ; ) 不会引起问题。

由于这是非标准的for循环,使用while循环可能更合适,因为关于它们如何工作的先入为主的想法较少,即,查看您的代码的人比for语句更容易读取while语句。通常有一个for循环应该如何在他们的脑子里工作的模型。

data.begin () == data.end ()

1
投票

您可以为此使用boost :: next(但在执行此操作之前,请确保列表中确实包含一个元素):

++mIter

1
投票
mIter = data.begin ();

while (++mIter != data.end ())
{
}

其中#include <algorithm> #include <iostream> #include <iterator> #include <list> #include <boost/assign.hpp> #include <boost/next_prior.hpp> using namespace boost::assign; int main() { std::list<int> lst = list_of(23)(9)(84)(24)(12)(18); std::copy(boost::next(lst.begin()), lst.end(), std::ostream_iterator<int>(std::cout, " ")); return 0; } 包含您要执行的代码...您甚至可以使用简单的包装函数对其进行微不足道的处理

iterable::iterator mIter = data.begin();    
std::for_each(++mIter, data.end(), some_func);

0
投票

这就是我会这样做的方法

some_func
© www.soinside.com 2019 - 2024. All rights reserved.