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循环那么请告诉我,因为我不熟悉这些事情。感谢。
答案 0 :(得分:2)
根据标准(在这种情况下为N3337),调用std::next
在内部有效地调用std::advance
(这不是必需的,但它的行为如此)。因此,std::advance
在理论上更有效,但在实践中不太可能出现明显的性能差异。
但是,值得注意的是,std::advance
无法使用r值迭代器作为其第一个参数调用(就像您通过调用begin()
或{{1 }。
关于您的代码运行缓慢的投诉。除非你在嵌套循环的主体中做得很少,否则这不太可能是由你如何递增迭代器引起的。
既然你说过你在那里打电话给end()
和erase
,我很想猜测其中一个或两个都是问题的一部分。
话虽这么说,我建议您在尝试进一步优化之前分析您的代码。这样您就可以做出明智的决定。
答案 1 :(得分:-2)
如果你看一下他们提到的复杂性,两者看起来都一样。
的std ::提前 复杂 线性。 但是,如果InputIt另外满足RandomAccessIterator的要求,则复杂性是恒定的。
的std ::下一 复杂 随机访问迭代器的常量。 否则,线性为n。
从实施的角度来看,特别是对于列表案例中的进展,也许它可以用跳过列表来表达。但我想如果是这样的话就会提到它。