for循环中迭代器函数next()与advance()的性能

时间:2015-05-21 06:52:32

标签: c++ list opencv iterator

next()advance()之间的效果有何不同?我问,因为我的代码很慢,我试图找出原因。

我浏览了几个不同类型的列表并使用for循环来更新三个不同的迭代器。代码看起来像这样:

listPt3d l1;        // std::list<cv::Point3d>
listlistPt2i l2;    // std::list<std::list<cv::Point2i>>
listlistPt3d l3;    // std::list<std::list<cv::Point3d>>

listPt3d::iterator iter1, iter1_2;
listlistPt2i::iterator iter2, iter2_2;
listlistPt3d::iterator iter3, iter3_2;

// compare lists with each other
for (iter1 = l1.begin(), iter2 = l2.begin(), iter3 = l3.begin();
     iter1 != prev(l1.end());
     iter1 = next(iter1), iter2 = next(iter2), iter3 = next(iter3))
{
    for (iter1_2 = next(iter1), iter2_2 = next(iter2), iter3_2 = next(iter3);
         iter1!= l1.end();
         iter1_2 = next(iter1_2), iter2_2 = next(iter2_2), iter3_2 = next(iter3_2))
    {
        // whatever
    }
}

我的问题是,使用iterator = next(iterator)advance(iterator, 1)是否更快,或者两者是否相同。我可以想象,由于没有赋值运算符,因此前进速度会快一些。

我避免使用++运算符,因为我有列表列表,因此会遇到++的问题。

如果有任何其他可能来迭代for循环那么请告诉我,因为我不熟悉这些事情。感谢。

2 个答案:

答案 0 :(得分:2)

根据标准(在这种情况下为N3337),调用std::next在内部有效地调用std::advance(这不是必需的,但它的行为如此)。因此,std::advance在理论上更有效,但在实践中不太可能出现明显的性能差异。
但是,值得注意的是,std::advance无法使用r值迭代器作为其第一个参数调用(就像您通过调用begin()或{{1 }。

关于您的代码运行缓慢的投诉。除非你在嵌套循环的主体中做得很少,否则这不太可能是由你如何递增迭代器引起的。
既然你说过你在那里打电话给end()erase,我很想猜测其中一个或两个都是问题的一部分。
话虽这么说,我建议您在尝试进一步优化之前分析您的代码。这样您就可以做出明智的决定。

答案 1 :(得分:-2)

如果你看一下他们提到的复杂性,两者看起来都一样。

的std ::提前 复杂 线性。 但是,如果InputIt另外满足RandomAccessIterator的要求,则复杂性是恒定的。

的std ::下一 复杂 随机访问迭代器的常量。 否则,线性为n。

从实施的角度来看,特别是对于列表案例中的进展,也许它可以用跳过列表来表达。但我想如果是这样的话就会提到它。