考虑一下这段代码:
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'等于零.
我在这里错过了什么?
希望性能,std::vector不会在每次修改时被"擦除和重新创建".
向量具有capacity可能超过其的向量size,这意味着它可以分配比实际使用的更多的内存.当您push_back,只有在新大小大于旧容量时才会重新分配,在这种情况下,迭代器将失效.
在您的情况下,您应该capacity在std::vector实例化后检查权限值.您将看到毫无疑问大于3,因此,您的push_back调用都不会触发重新分配,并且所有迭代器都保持有效.
另请注意,它std::vector提供了一个reserve成员函数,允许您控制向量容量.当您知道要插入多少元素以避免重新分配时,这非常有用.