使用函数作为'for'循环的第二个参数

时间:2013-02-06 15:46:02

标签: c++

我们假设我有以下代码:

for(std::vector<int>::iterator i = vect.begin(); i != vect.end(); ++i)
{
    //do smth here
}

每次迭代都会重新调用vect.end()吗?如果是,那么我应该如何迭代一个向量呢?

在逻辑表达式(for循环的第二个参数)内部调用函数通常是不好的做法吗?

3 个答案:

答案 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.
}