繁体   English   中英

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

[英]Performance of iterator function next() vs. advance() in for-loops

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循环那么请告诉我,因为我不熟悉这些事情。 谢谢。

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

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

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

std :: advance Complexity Linear。 但是,如果InputIt另外满足RandomAccessIterator的要求,则复杂性是不变的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM