将指针指向容器中的元素

Pil*_*lsy 4 c++ pointers stl

说我有一个对象:

struct Foo 
{
    int bar_;
    Foo(int bar) bar_(bar) {}
};
Run Code Online (Sandbox Code Playgroud)

我有一个包含Foos 的STL容器,也许是一个矢量,我拿了

// Elsewhere...

vector<Foo> vec;

vec.push_back(Foo(4));

int *p = &(vec[0].bar_)
Run Code Online (Sandbox Code Playgroud)

这是一个可怕的想法,对吧?

原因是vector将其元素存储在某个动态分配的数组中,最终,如果添加足够的元素,则必须分配另一个数组,复制原始数组的所有元素,并删除旧数组.在那之后,p指向垃圾.这就是为什么a上的许多操作vector都会使迭代器无效.

似乎可以合理地假设一个使容器中的迭代器无效的操作也会使指向容器元素的数据成员的指针无效,并且如果一个操作不会使迭代器失效,那些指针仍然是安全的.但是,许多合理的假设都是错误的.这是其中之一吗?

Pot*_*ter 11

该标准指定何时使这些指针无效.vector当您增加其大小capacity或添加/删除前一个元素时引用到模具中.deque如果从中间添加/删除,则对a的引用无效.

否则,引用和迭代器可以安全地保留底层对象的生命周期.