C++ for循环:条件评估

mar*_*nus 3 c++ performance for-loop conditional-statements

关于循环,我有一个(愚蠢的?)C/C++问题:

for (size_t i = 0; i < std::distance(begin, end); ++i) {
  a.push_back(i);
}
Run Code Online (Sandbox Code Playgroud)

begin并且end是两个迭代器.我的问题是,是否std::distance(begin, end)为循环中的每个元素计算?或者使用此版本更好:

size_t dist = std::distance(begin, end);
for (size_t i = 0; i < dist; ++i) {
  a.push_back(i);
}
Run Code Online (Sandbox Code Playgroud)

小智 6

第二个版本更好.在第一个中,每次评估条件(没有关于结果不变的自动假设).


Naw*_*waz 5

是的。第二个版本更好。

对于第一个版本,如果容器类型astd::vector begin,并且end是 的迭代器a,那么该push_back操作可能会导致调整向量的大小,这反过来会使beginend迭代器失效,并且在下一次迭代中使用它们来计算距离将调用未定义的行为。在这种情况下,第二个不仅更好,而且定义明确。