C++ 使用函数作为';对于';环

C++ 使用函数作为';对于';环,c++,C++,假设我有以下代码: for(std::vector<int>::iterator i = vect.begin(); i != vect.end(); ++i) { //do smth here } for(std::vector::iterator i=vect.begin();i!=vect.end();+i) { //你在这儿玩吗 } 每次迭代都要重新调用vect.end()吗?如果是,那么我应该如何迭代向量 在逻辑表达式(for循环的第二个参数)中调用函数通常是不

假设我有以下代码:

for(std::vector<int>::iterator i = vect.begin(); i != vect.end(); ++i)
{
    //do smth here
}
for(std::vector::iterator i=vect.begin();i!=vect.end();+i)
{
//你在这儿玩吗
}
每次迭代都要重新调用vect.end()吗?如果是,那么我应该如何迭代向量


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

是的,它会。但是,如果编译器能够确定由
vect.end()
返回的值永远不会更改,那么它当然可以对其进行优化。但是,如果您确实想避免这样做,只需将代码更改为:

for(std::vector<int>::iterator i = vect.begin(), end = vect.end();
    i != end; ++i)
{
    //do smth here
}
for(std::vector::iterator i=vect.begin(),end=vect.end();
i!=结束;++i)
{
//你在这儿玩吗
}

当然,您应该确保您的代码不依赖于在每次迭代中检查
end()
。例如,如果您正在对向量中的元素执行
vect.erase(i)
,则需要确保每次都获得新的
end()
迭代器(并确保将
erase
的结果分配给
i
)。

是的,它会。但是,如果编译器能够确定由
vect.end()
返回的值永远不会更改,那么它当然可以对其进行优化。但是,如果您确实想避免这样做,只需将代码更改为:

for(std::vector<int>::iterator i = vect.begin(), end = vect.end();
    i != end; ++i)
{
    //do smth here
}
for(std::vector::iterator i=vect.begin(),end=vect.end();
i!=结束;++i)
{
//你在这儿玩吗
}

当然,您应该确保您的代码不依赖于在每次迭代中检查
end()
。例如,如果您正在对向量中的元素执行
vect.erase(i)
,则需要确保每次都获得新的
end()
迭代器(同时确保将
erase
的结果分配给
i
)。

您所拥有的一切似乎都很好
vect.end()

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

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

}
typedef std::vector::iterator iter;
iter端=向量端();
for(iter it=vect.begin();it!=end;++it){
}

你所拥有的一切似乎都很好
vect.end()

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

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

}
typedef std::vector::iterator iter;
iter端=向量端();
for(iter it=vect.begin();it!=end;++it){
}

这没什么错

或:


这没什么错

或:


在循环中你打算做什么?除了解引用正确的值之外,您还需要索引吗?现代形式只是
for(inti:vect)
。编译器知道如何迭代向量、列表、数组和任何看起来足够相似的东西。@AlokSave当然不是重复。@LuchianGrigore:Q上的答案解决了这个问题。特别是詹姆斯·坎兹的回答。我不认为有人在这里重复所有这些有什么好处。@AlokSave我不确定这在性能方面是如何工作的,在我看来,另一个问题与我无关。在循环中,你打算怎么做?除了解引用正确的值之外,您还需要索引吗?现代形式只是
for(inti:vect)
。编译器知道如何迭代向量、列表、数组和任何看起来足够相似的东西。@AlokSave当然不是重复。@LuchianGrigore:Q上的答案解决了这个问题。特别是詹姆斯·坎兹的回答。我不认为有人在这里重复所有这些有什么好处。@AlokSave我不确定这在性能方面是如何工作的,在我看来,另一个问题与我无关。或者干脆
for(std::vector::iterator I=vect.begin(),end=vect.end();I!=end;++I)
。这种方法有一个警告-如果do SMTHE here位很可能会变异向量,则您的范围现在无效!在我看来,使用
end()
总是最安全的。@Nim刚刚添加了这一点。谢谢。@us2012是的,这是一个更好的编写方法-更好的范围。或者简单地
(std::vector::iterator i=vect.begin(),end=vect.end();i!=end;++i)
。这种方法有一个警告-如果dosmth-here位很可能会变异向量,那么您的范围现在无效!在我看来,使用
end()
总是最安全的。@Nim刚刚添加了这一点。谢谢。@us2012是的,这是一个更好的书写方式-更好的范围。