C++ 从std::vector::operator[]获取返回地址的作用是什么?

C++ 从std::vector::operator[]获取返回地址的作用是什么?,c++,pointers,stl,vector,C++,Pointers,Stl,Vector,我正在做一些类似于: struct ABC{ int p,q,r; }; struct X{ ABC *abc; X(ABC &abc) : abc(&abc) {} }; std::vector<ABC> vec; ... //populate vec X x(vec[2]); 结构ABC{ int p,q,r; }; 结构X{ ABC*ABC; X(ABC&ABC):ABC&ABC{} }; std::vec; ... //填充向量 X(vec[2]);

我正在做一些类似于:

struct ABC{
int p,q,r;
};

struct X{
ABC *abc;
X(ABC &abc) : abc(&abc) {}
};

std::vector<ABC> vec;
... //populate vec

X x(vec[2]);
结构ABC{ int p,q,r; }; 结构X{ ABC*ABC; X(ABC&ABC):ABC&ABC{} }; std::vec; ... //填充向量 X(vec[2]);
当我调试时,
x.abc
在赋值之后看起来是正确的,但不久之后,x.abc中的数据就是垃圾。这让我觉得指针指向一个局部变量。。。但是
vector::operator[]
返回一个引用,所以这是可能的吗?

在内部,
std::vector
通常维护它包含的元素的动态数组。如果向量的大小增长过大并超过其旧容量,它将分配一个新数组,复制旧元素,然后取消分配旧数组。因此,任何指向该旧数组的引用或指针都将无效,如果使用,将导致未定义的行为

如果要将指针存储到向量中,应确保向量不会重新分配其内部缓冲区。您可以在获取引用之前等待将要添加到向量的所有元素添加完毕,或者调用
vector::reserve
以确保容量足够大

不过,更好的做法是将对
向量的引用与索引一起存储,然后每次在该索引处查找元素。这样,如果向量调整其内部缓冲区的大小,指针就不会变成垃圾,因为每次都要对向量进行索引


希望这有帮助

这可能是
std::deque
而不是
std::vector
@ildjarn的一个很好的用例:指向
deque
的指针可能会失效我相信,你是否想过
列表
?@Jesse:尽管迭代器会失效,插入
std::deque
的指针/引用在前面插入或后面插入
deque
时不会失效,因为它不需要像
std::vector
必须的那样重新分配现有元素(参见C++11§23.3.3.4/1)。@ildjar:,只要他们不做
insert`.@Jesse:即使是insert也可以,只要在前面或后面。更新了一点,希望更清楚。