考虑这段代码:

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/

10-13 06:50
查看更多