迭代器生命周期

Iterator lifetime

情况是这样的:

vector <string>::iterator * it;
{
    vector <string> v{"asd", "asd"};
    auto iter = v.begin();
    it = new vector <string>::iterator(iter);
}
(**it) = string("asd");

现在,我在网络上找不到任何资源可以告诉我这是 UB 还是有效代码。

我的问题是:
当我创建一个迭代器时,如果该迭代器的生命周期比引用的容器长,是未定义的行为还是在标准中的某处定义?

在您发布的代码中,

(**it) = string("asd");

导致未定义的行为。

*iter 是一个迭代器,但当您到达该行时,对应的 vector 已不存在。因此,**iter 类似于取消引用悬挂指针。顺便说一句,如果你只使用 iterator 而不是 iterator*.

,那不会改变

以下代码也会导致未定义的行为。

vector <string>::iterator it;
{
    vector <string> v{"asd", "asd"};
    auto iter = v.begin();
    it = iter;
}
(*it) = string("asd");