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()所得到的一样)。

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

09-25 17:47