[英]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()
。
关于您的代码运行缓慢的投诉。 这不太可能是由于你如何递增迭代器而引起的,除非你在嵌套循环体中做的很少。
既然你说你在那里叫erase
和splice
,我很想猜测其中一个或两个都是问题的一部分。
话虽这么说,我建议您在尝试进一步优化之前分析您的代码。 这样你就可以做出明智的决定。
如果你看看他们提到的复杂性,两者看起来都一样。
std :: advance Complexity Linear。 但是,如果InputIt另外满足RandomAccessIterator的要求,则复杂性是不变的。
std :: next复杂性随机访问迭代器的常量。 否则,线性为n。
从实施的角度来看,特别是对于列表案例的推进,也许它可以用跳过列表来改善。但我想如果是这样的话就会提到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.