假设我有以下代码:
for(std::vector<int>::iterator i = vect.begin(); i != vect.end(); ++i)
{
//do smth here
}
每次迭代都会重新调用 vect.end() 吗?如果是,那么我应该如何迭代向量呢?
在逻辑表达式(for循环的第二个参数)中调用函数通常是不好的做法?
假设我有以下代码:
for(std::vector<int>::iterator i = vect.begin(); i != vect.end(); ++i)
{
//do smth here
}
每次迭代都会重新调用 vect.end() 吗?如果是,那么我应该如何迭代向量呢?
在逻辑表达式(for循环的第二个参数)中调用函数通常是不好的做法?
是的,它会。但是,如果编译器可以确定返回的值vect.end()
永远不会改变,它当然可以优化它。但是,如果您想避免这样做,只需将代码更改为:
for(std::vector<int>::iterator i = vect.begin(), end = vect.end();
i != end; ++i)
{
//do smth here
}
当然,您应该确保您的代码不依赖于end()
在每次迭代中进行检查。例如,如果您vect.erase(i)
对向量中的元素进行处理,则需要确保end()
每次都获得新的迭代器(并确保将结果分配给erase
to i
)。
你所拥有的似乎非常好。vect.end()
应该是 O(1) 操作,所以这不会对性能造成巨大影响。
但是,如果您正在寻找替代方案:
typedef std::vector<int>::iterator iter;
iter end = vect.end();
for(iter it = vect.begin(); it != end; ++it) {
}
没有错。
或者:
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.
}