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.
向量的存储被重新分配(以在一个连续块中容纳更多元素),从而使所有指针(和迭代器)无效。
在这里了解更多信息:http://en.cppreference.com/w/cpp/container/vector/push_back
如果 new
size()大于,capacity()那么所有迭代器和引用(包括尾后迭代器)都将失效。否则,只有尾后迭代器才会失效。