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()
所得到的一样)。
关于您的代码运行缓慢的投诉。除非您在嵌套循环的主体中做得很少,否则这不太可能由您增加迭代器的方式引起。
由于您说过要在某个地方调用erase
和splice
,因此我很容易猜测这两者之一或两者都是问题的一部分。
话虽如此,我建议您在尝试进一步优化之前先分析代码。这样,您就可以根据自己的需求做出明智的决策。