用迭代器控制流程

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.

时失效