为什么我指向 std::vector 元素的指针在 push_back() 之后改变了它的值?
Why did my pointer to a std::vector's element change its value after push_back()?
我使用了一个简单的代码:
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;
该代码生成以下输出:
elemPtr = 3.42
elemPtr = -6.25982e+18
为什么会发生在push_back之后?我没有删除向量的第一个元素。为什么会这样?
我使用 Clang 编译器 (Xcode)。
矢量的存储空间已重新分配(以在一个连续块中容纳更多元素),使所有指针(和迭代器)无效。
在此处了解更多信息:http://en.cppreference.com/w/cpp/container/vector/push_back
If the new size()
is greater than capacity()
then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated.
push_back
使指向现有元素的指针、引用和迭代器无效。
那是因为连续性保证。 push_back
增加向量的大小,如果内部缓冲区的容量不足以在现有项之后立即容纳新项,为了保持连续性,它们都必须移动到新项更大的缓冲区。
如果您想在以后调用 push_back
后继续访问某个元素,您的选择是通过向量中的索引访问它,或者使用不保证连续性的容器,例如 std::list
.
我使用了一个简单的代码:
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;
该代码生成以下输出:
elemPtr = 3.42
elemPtr = -6.25982e+18
为什么会发生在push_back之后?我没有删除向量的第一个元素。为什么会这样?
我使用 Clang 编译器 (Xcode)。
矢量的存储空间已重新分配(以在一个连续块中容纳更多元素),使所有指针(和迭代器)无效。
在此处了解更多信息:http://en.cppreference.com/w/cpp/container/vector/push_back
If the new
size()
is greater thancapacity()
then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated.
push_back
使指向现有元素的指针、引用和迭代器无效。
那是因为连续性保证。 push_back
增加向量的大小,如果内部缓冲区的容量不足以在现有项之后立即容纳新项,为了保持连续性,它们都必须移动到新项更大的缓冲区。
如果您想在以后调用 push_back
后继续访问某个元素,您的选择是通过向量中的索引访问它,或者使用不保证连续性的容器,例如 std::list
.