【问题标题】:Traversing through a C++ container - what's the fastest way? [closed]遍历 C++ 容器 - 最快的方法是什么? [关闭]
【发布时间】:2014-02-20 20:26:23
【问题描述】:
vector<int> my_vector(10);

// A
for (size_t i = 0; i < my_vector.size(); i++) {
    // Do stuff with my_vector[i]       
}

//B
for (vector<int>::iterator it = my_vector.begin(); it != my_vector.end(); it++) {
    // Do stuff with (*it)      
}

//C
for (vector<int>::const_iterator it = my_vector.begin(); it != my_vector.end(); it++) {
    // Do stuff with (*it)      
}

请回答以下问题:

1) 如果我在循环中所做的事情改变了 my_vector 元素的值,那么使用 B 而不是 A 更有效吗?这里效率=更快的遍历。如果是,为什么?

2)如果不修改my_vector的元素,三者中最快的方法是什么?

【问题讨论】:

  • 正如 Andrei Alexandrescu 所说,当谈到性能和速度时......“我应该衡量一下”。
  • 您的程序是否不符合您的性能要求?你有没有分析和追踪到这个地方的瓶颈?
  • 它们都具有相同的复杂性。我们能说的就这么多了。
  • @user3334441 '这只是一个理论问题' 所以就这一点(性能)提出理论问题是一件愚蠢的事情。这当然全部取决于您正在使用的目标平台(工具链和操作系统)。
  • @JasonC 我只是为了好风格而采用它,而不是通过微优化:如果我不需要副本,我就不需要!

标签: c++ iterator const-iterator


【解决方案1】:

现代编译器足够聪明,可以平等地优化所有三个。您可以随时测量它们或查看生成的程序集。

通用迭代器方法的一个好处是,无论您使用哪种容器类型,您都可以使用相同的代码进行最佳时间前向顺序迭代(例如,您可以使用 listset 代替vector)。这可能对您的情况有用,也可能没用。

如果您的应用程序有问题无法满足您的性能要求,并且您已将其分析并具体确定为您的瓶颈,请首先考虑替代更高级别的算法,然后专注于对此点进行微优化。

更重要的问题是:这三个中哪一个生成的代码最清晰、最易读、最易于维护?

【讨论】:

    【解决方案2】:

    在打字方面,以上都不是答案:

    std::for_each(v.begin(), v.end(), func);
    

    其中func 是函子、独立函数或 lambda 函数。

    就编译器生成的代码而言 - 在 95% 的情况下,这 3 个选项中的任何一个都不会(大部分)有区别。索引版本的轻微例外 - 在未优化的构建中,这可能会在每次迭代时调用 v.size()。但是,启用优化后,它们都应该基本相同。在确定性能方面,分析和测试是关键。您必须找到真正的瓶颈,然后才能考虑尝试优化。如果不分析应用程序,您可能会优化一些很少被调用或不是您的瓶颈的东西。

    真正的关键在于编写可读的代码 - 通常避免使用手写循环以支持适当的算法实现。

    【讨论】:

    • 还有 C++11:for (auto i : v) { /* do stuff with i */ }.
    • @Snps 也许只是我是个老家伙,但我仍然更喜欢 for_each 而不是范围很广的 for 语法,但每个人都有自己的语法。
    • @Snps 此外,如果您使用的是 Qt,它有一个很好的 foreach 宏,可以与 STL 容器一起使用 (foreach (int i, v) { /* do stuff */ })。
    • @ZacHowland 两者都很有用。如果归结为每次迭代都调用一个函数,那么我可能会使用std::for_each。但是如果我需要执行多个语句,那么我更喜欢基于范围的 for 循环而不是例如声明一个 lambda 表达式。
    • @ZacHowland 我支持你:auto 在这里,伙计。至少他们给了我们overridefinal。最初他们不在选秀中。我非常清楚地记得在新闻组中大肆宣扬它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2011-07-17
    • 2012-07-16
    • 2011-04-24
    • 2020-01-17
    • 2017-09-15
    相关资源
    最近更新 更多