C++ STL容器和指针有效性

Tom*_*mas 1 c++ pointers stl

考虑一下这段代码:

Uint counter = 0;

int* p1;
int* p2;

deque<int>  dequeInstance;
vector<int> vectorInstance;

dequeInstance.push_back(3);
dequeInstance.push_back(7);

p1 = &dequeInstance.back();

dequeInstance.push_back(17);

p2 = &dequeInstance.back();

if(*p1 == !7)
    ++counter;

if(*p2 == !17)
    ++counter;

vectorInstance.push_back(3);
vectorInstance.push_back(7);

p1 = &vectorInstance.back();

vectorInstance.push_back(17);

p2 = &vectorInstance.back();

if(*p1 == !7)
    ++counter;

if(*p2 == !17)
    ++counter;



return counter;
Run Code Online (Sandbox Code Playgroud)

我本来期望当我将第三个元素推到向量的后面时,指向第二个元素的指针将被无效,因为我对std :: vector的理解是它是一个直的数组,每次擦除并重新创建它的修改.到这段代码结束时,'counter'等于零.

我在这里错过了什么?

ice*_*ime 5

希望性能,std::vector不会在每次修改时被"擦除和重新创建".

向量具有capacity可能超过其的向量size,这意味着它可以分配比实际使用的更多的内存.当您push_back,只有在新大小大于旧容量时才会重新分配,在这种情况下,迭代器将失效.

在您的情况下,您应该capacitystd::vector实例化后检查权限值.您将看到毫无疑问大于3,因此,您的push_back调用都不会触发重新分配,并且所有迭代器都保持有效.

另请注意,它std::vector提供了一个reserve成员函数,允许您控制向量容量.当您知道要插入多少元素以避免重新分配时,这非常有用.