我们假设我有以下代码:
for(std::vector<int>::iterator i = vect.begin(); i != vect.end(); ++i)
{
//do smth here
}
每次迭代都会重新调用vect.end()吗?如果是,那么我应该如何迭代一个向量呢?
在逻辑表达式(for循环的第二个参数)内部调用函数通常是不好的做法吗?
答案 0 :(得分:7)
是的,它会的。但是,如果编译器可以确定vect.end()
返回的值永远不会改变,那么它当然可以优化它。但是,如果您想避免这样做,只需将代码更改为:
for(std::vector<int>::iterator i = vect.begin(), end = vect.end();
i != end; ++i)
{
//do smth here
}
当然,您应确保您的代码不依赖于每次迭代时end()
进行检查。例如,如果您对向量中的元素执行vect.erase(i)
,则需要确保每次都获得新的end()
迭代器(并确保分配{{1}的结果到erase
)。
答案 1 :(得分:1)
你所拥有的一切似乎都很好。 vect.end()
应该是O(1)操作,因此不会造成巨大的性能损失。
但如果您正在寻找替代方案:
typedef std::vector<int>::iterator iter;
iter end = vect.end();
for(iter it = vect.begin(); it != end; ++it) {
}
答案 2 :(得分:0)
没错。
或:
std::vector<int>::iterator it = vect.begin();
std::vector<int>::iterator end = vect.end();
for(it; it != end; it++) ...
或者,如果您的编译器支持C ++ 11基于范围的for循环,您可以像这样迭代向量:
for(auto x : vect)
{
//x is the actual int, not an iterator.
}