gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:41:07 25 4
gpt4 key购买 nike

考虑这段代码:

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 的容量可能会超过它的大小,这意味着它可以分配比实际使用更多的内存。当您push_back 时,仅当新大小大于旧容量时才会发生重新分配,在这种情况下,迭代器将失效。

在您的情况下,您应该在 std::vector 实例化之后立即检查 capacity 的值。您会看到它毫无疑问大于 3,因此,您的 push_back 调用都不会触发重新分配,并且所有迭代器仍然有效。

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

关于C++ STL 容器和指针有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4358089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com