1

假设我有以下代码:

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

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

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

4

3 回答 3

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()每次都获得新的迭代器(并确保将结果分配给eraseto i)。

于 2013-02-06T15:48:31.103 回答
1

你所拥有的似乎非常好。vect.end()应该是 O(1) 操作,所以这不会对性能造成巨大影响。

但是,如果您正在寻找替代方案:

typedef std::vector<int>::iterator iter;
iter end = vect.end();
for(iter it = vect.begin(); it != end; ++it) {

}
于 2013-02-06T15:50:33.083 回答
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.
}
于 2013-02-06T15:53:15.460 回答