我正在寻找一种易于理解的,优雅的方法来在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::next(iter, n)
算法,尽管它使用起来并不简单(它通过非const引用获取迭代器,并且不返回它)。
例如,
std::advance
或
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
中的> = 1个元素来避免发生异常。
您可以尝试:
#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 ()
您可以为此使用boost :: next(但在执行此操作之前,请确保列表中确实包含一个元素):
++mIter
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);
这就是我会这样做的方法
some_func