在for循环中计算向量大小,每次迭代都很昂贵吗?

use*_*422 15 c++ c++11

c ++编译器是否处理像建筑物是矢量的情况:

for (int i = 0; i < buildings.size(); i++) {}
Run Code Online (Sandbox Code Playgroud)

也就是说,它是否注意到是否在循环中修改了建筑物,然后根据每次迭代不评估它?或者也许我应该自己做,不是那么漂亮,但是:

int n = buildings.size();
for (int i = 0; i < n; i++) {}
Run Code Online (Sandbox Code Playgroud)

Tim*_*lds 12

buildings.size()编译器可能会内联直接访问vector<T>类上的私有大小字段.所以你不应该把电话分开size.无论如何,这种微优化都是你不想担心的事情(除非你通过分析确定为一个非常紧密的循环瓶颈).


Fre*_*abe 7

不要通过考虑表现来决定是否选择其中一个; 您的编译器可能会或可能不会内联调用 - 并且std::vector::size()也具有不变的复杂性.

您应该考虑的是正确性,因为如果在迭代时添加或删除元素,则两个版本的行为会有很大差异.

如果不在循环中以任何方式修改向量,请坚持使用前一版本以避免一点状态(n变量).