为什么我的指向std :: vector元素的指针在push_back()之后改变了它的值?

Jav*_*ner 1 c++ vector stdvector

我使用一个简单的代码:

std::vector < float > arr = { 3.42f, 6.45f, 53.43f };
float *elemPtr;
elemPtr = &arr[ 0 ];

std::cout << "elemPtr = " << *elemPtr << std::endl;
arr.push_back( 7.0f );
std::cout << "elemPtr = " << *elemPtr << std::endl;
Run Code Online (Sandbox Code Playgroud)

该代码产生以下输出:

elemPtr = 3.42
elemPtr = -6.25982e+18
Run Code Online (Sandbox Code Playgroud)

为什么在push_back之后会发生这种情况?我没有删除向量的第一个元素.它为什么会这样?

我使用Clang编译器(Xcode).

Ben*_*igt 10

push_back 使指针,引用和现有元素的迭代器无效.

这是因为邻接保证. push_back增加向量的大小,如果内部缓冲区的容量不足以在现有缓冲区之后立即保存新项目,为了保持连续性,它们都必须移动到新的更大的缓冲区.

如果要在将来调用后继续访问元素push_back,则选项是通过向量中的索引访问它,或使用没有连续性保证的容器,例如std::list.


szy*_*zym 6

向量的存储被重新分配(以在一个连续块中容纳更多元素),从而使所有指针(和迭代器)无效。

在这里了解更多信息:http://en.cppreference.com/w/cpp/container/vector/push_back

如果 newsize()大于,capacity()那么所有迭代器和引用(包括尾后迭代器)都将失效。否则,只有尾后迭代器才会失效。