-4
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的元素,三者中最快的方法是什么?

4

2 回答 2

2

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

通用迭代器方法的一个好处是,无论您使用什么容器类型,您都可以使用相同的代码进行最佳时间前向顺序迭代(例如,您可以放入 alist或 aset而不是 a vector)。这可能对您的情况有用,也可能没有用。

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

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

于 2014-02-20T20:30:28.733 回答
1

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

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

wherefunc是函子、独立函数或 lambda 函数。

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

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

于 2014-02-20T20:34:32.837 回答