【发布时间】:2011-12-17 04:59:18
【问题描述】:
我有一个关于循环的(愚蠢的?)C/C++ 问题:
for (size_t i = 0; i < std::distance(begin, end); ++i) {
a.push_back(i);
}
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);
}
【问题讨论】:
-
我不完全确定,但我认为第一个可能会慢得多。我认为编译器无法确定
std::distance(begin, end)是常量,但我可能错了。 -
@quasiverse: 恐怕你错了:-S 感谢迭代器类别和特征检查,随机访问迭代器允许
distance的恒定时间实现。检查你的编译器的实现! -
问题的简化和相关版本是在
for (auto it = v.begin(); it != v.end(); ++it)中是否在每一轮中都执行对v.end()的调用。该标准要求程序的行为就像每次调用它,因此编译器只有在能够证明结果始终相同(并且没有副作用)的情况下才能对其进行优化. -
@Kerrel: if 它是一个随机访问迭代器。但 quasiverse 表示它可以显着变慢。例如,当开始/结束不是随机访问时,
distance是否被提升就变得相当重要。如果编译器不能这样做,那么程序员应该这样做。 -
请注意,如果需要,您可以在循环内限定额外变量:
for (size_t i = 0, dist = std::distance(begin, end); i < dist; ++i)。
标签: c++ performance for-loop conditional-statements