【发布时间】:2017-01-30 02:44:46
【问题描述】:
我最近遇到了以下代码。
std::map<int, int> m;
// insert into the map
std::map<int, int>::iterator endOfMap = m.end();
for(std::map<int, int>::iterator itr = m.begin(); itr != endOfMap; ++itr) {
}
与下面的相比,预先计算 endOfMap 有什么优势吗?
for(std::map<int, int>::iterator itr = m.begin(); itr != m.end(); ++itr)
注意:
我看到的代码是字符串到自定义对象的映射,包含数百万个元素。
【问题讨论】:
-
好吧,它们的计算速度可能会如此接近,但是让我们以第一个例子为例,第一个例子已经计算了函数调用并执行它需要的任何操作,以 endOfMap。终止条件中的第二个示例将多次调用 m.end() 函数,然后检查它们是否相等。而不是仅仅检查它们是否不相等而不是多次调用该函数。
-
您在 for 循环迭代中谈论 O(end()) + O(equality checks) vs. O(equality checks)。
-
map 的数据内存分配带来的性能下降将超过循环外调用 end() 带来的任何改进!
标签: c++ performance stl iterator