我有一个关于循环的(愚蠢?)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)
是常数,但我可能错了。 - flightdistance
的常数时间。看看你的编译器实现吧! - Kerrek SBfor (auto it = v.begin(); it != v.end(); ++it)
中,对v.end()
的调用是否在每轮中执行。标准要求程序表现得好像每次都被调用一样,因此编译器只能在它能证明结果始终相同(并且没有副作用)时将其优化掉。 - Kerrek SBdistance
是否被提升就变得非常重要。如果编译器无法执行,则程序员应该这样做。 - Steve Jessopfor (size_t i = 0, dist = std::distance(begin, end); i < dist; ++i)
。 - Mike Seymour