用迭代器控制流程
Control flow with iterators
假设我有这样的东西:
void myFunk(std::vector<T>& v, std::vector<T>::iterator first, std::vector<T>::iterator last) {
while (first != last) {
if ((*first) > (*last)) {
T someT;
v.push_back(someT);
}
first++;
}
}
int main(){
std::vector<T> foo = {some, T, values};
myFunky(foo, foo.begin(), foo.end())
return 0;
}
这会导致无限循环,还是会在 foo.size()
次迭代后结束?换句话说,last
迭代器会随着 foo
的增长而更新,还是会保留函数调用中给定的值?
我假设 last
会改变,因为它是一个指向位置的指针,但需要一些确认。
Would this lead to an infinite loop, or would it end after foo.size()
iterations?
都没有。您正在做的是 未定义的行为,原因如下:
您正在修改 vector
并遍历它。
如果向量在推送新项目时重新分配其内部存储,则所有现有迭代器进入 vector
都将 无效,包括您用来循环的两个迭代器.但即使只是推送一个新项目也总是会使 end()
迭代器无效,至少。
见Iterator invalidation rules for C++ containers
您正在取消引用 end()
迭代器,它从不引用有效元素。
I'm assuming last
would change, since it's a pointer to a position
它不能改变,因为你按值将它传递给 myFunc
函数,所以它是原始 end()
迭代器的 copy .如果 end()
更改值,last
将不会更改值,因为它是 copy.
无论如何,迭代器不一定实现为指针,但指针是有效的迭代器。但在这种情况下没关系。即使 vector::iterator
只是一个简单的指针,last
仍然会在每个 push/reallocation.
时失效
假设我有这样的东西:
void myFunk(std::vector<T>& v, std::vector<T>::iterator first, std::vector<T>::iterator last) {
while (first != last) {
if ((*first) > (*last)) {
T someT;
v.push_back(someT);
}
first++;
}
}
int main(){
std::vector<T> foo = {some, T, values};
myFunky(foo, foo.begin(), foo.end())
return 0;
}
这会导致无限循环,还是会在 foo.size()
次迭代后结束?换句话说,last
迭代器会随着 foo
的增长而更新,还是会保留函数调用中给定的值?
我假设 last
会改变,因为它是一个指向位置的指针,但需要一些确认。
Would this lead to an infinite loop, or would it end after
foo.size()
iterations?
都没有。您正在做的是 未定义的行为,原因如下:
您正在修改
vector
并遍历它。如果向量在推送新项目时重新分配其内部存储,则所有现有迭代器进入
vector
都将 无效,包括您用来循环的两个迭代器.但即使只是推送一个新项目也总是会使end()
迭代器无效,至少。见Iterator invalidation rules for C++ containers
您正在取消引用
end()
迭代器,它从不引用有效元素。
I'm assuming
last
would change, since it's a pointer to a position
它不能改变,因为你按值将它传递给 myFunc
函数,所以它是原始 end()
迭代器的 copy .如果 end()
更改值,last
将不会更改值,因为它是 copy.
无论如何,迭代器不一定实现为指针,但指针是有效的迭代器。但在这种情况下没关系。即使 vector::iterator
只是一个简单的指针,last
仍然会在每个 push/reallocation.