考虑这段代码:
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;
我曾期望,当我将第三个元素推到 vector 的后面时,指向第二个元素的指针将失效,因为我对std::vector的理解是,它是一个直线数组,每次擦除并重新创建它其修改。但是,在此代码末尾,“计数器”等于零。
我在这里想念什么?
最佳答案
希望为了提高性能,std::vector
不会“在每次修改时都被擦除并重新创建”。
vector 的capacity
可能会超过其size
,这意味着它可以分配比真正使用的更多的内存。当您push_back
时,仅当新大小大于旧容量时才发生重新分配,并且在这种情况下,迭代器无效。
对于您的情况,应在capacity
实例化之后立即检查std::vector
的值。您将毫无疑问地看到它大于3,因此,您的push_back
调用均不会触发重新分配,并且所有迭代器均保持有效。
另请注意,std::vector
提供了reserve
成员函数,可用于控制 vector 容量。当您知道要插入多少个元素以避免不必要的重新分配时,此功能非常有用。
关于c++ - C++ STL容器和指针有效性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4358089/