首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for-循环中迭代器函数next()与advance()的性能

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

Stack Overflow用户
提问于 2015-05-21 06:52:31
回答 2查看 1.7K关注 0票数 3

next()advance()在性能上有什么不同吗?我在问,因为我的代码非常慢,我试图找出原因。

我浏览了几个不同类型的列表,并使用了一个for循环,在其中我更新了三个不同的迭代器。代码如下所示:

代码语言:javascript
复制
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循环,那么请告诉我,因为我对这些事情不太熟悉。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-21 07:44:22

根据标准(本例中为N3337),调用std::next实际上是在内部调用std::advance (这不是必需的,但它的行为是这样的)。因此,std::advance在理论上更有效,但在实践中不太可能存在明显的性能差异。

但是,值得注意的是,不能使用r值迭代器作为它的第一个参数来调用std::advance (就像调用begin()end()所得到的结果一样)。

关于您对代码运行缓慢的抱怨。这不太可能是由于迭代器增量的方式造成的,除非您在嵌套循环中所做的事情非常少。

由于您说您在某个地方调用了erasesplice,我很想猜测其中一个或两者都是问题的一部分。

尽管如此,在尝试进一步优化之前,我建议您分析一下您的代码。这样,你就可以对你正在优化的东西做出明智的决定。

票数 2
EN

Stack Overflow用户

发布于 2015-05-21 07:01:54

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

前进复杂度线性。但是,如果InputIt额外地满足了RandomAccessIterator的要求,那么复杂性是恒定的。

std:随机访问迭代器的下一个复杂性常数。否则,线性n。

从实现的角度来看,特别是在lists情况下,也许可以更好地使用skiplists..but --我想如果是这样的话,应该会提到它。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30366519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档