考虑这段代码:
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;
我原本以为当我将第三个元素推到向量的后面时,指向第二个元素的指针就会失效,因为我对std :: vector的理解是它的一个直的数组被擦除了每次修改时重新创建。到这段代码结束时,'counter'等于零。
我在这里缺少什么?
答案 0 :(得分:5)
希望性能方面,每次修改时都不会“擦除并重新创建std::vector
”。
向量的capacity
可能超过其size
,这意味着它可以分配比真正使用的内存更多的内存。当您push_back
时,仅当新大小大于旧容量时才会重新分配,而在这种情况下 ,迭代器将失效。
在您的情况下,您应该在capacity
实例化后立即检查std::vector
的值。您将看到它毫无疑问大于3,因此,您的push_back
调用都不会触发重新分配,并且所有迭代器都保持有效。
另请注意,std::vector
提供了reserve
成员函数,可用于控制向量容量。当您知道要插入多少元素以避免重新分配时,这非常有用。
答案 1 :(得分:2)
好的,你有一些问题。首先,!n = 0,除非n = 0然后它等于1.因此计数器永远不会增加。
其次,当你推送一个新元素时,向量不一定会破坏内容。矢量有2“大小”。 1是向量中的元素数,2是分配的内存量。仅当分配的内存量用完时,才会重新分配和复制向量。
此外,在删除内存区域后,内存不一定被清除,仍可能指向有效数据。
您没有使用迭代器,因此它们不会失效。您正在使用指针,它们只是指向一个内存区域。仅仅因为没有分配内存并不意味着指针无效。这是C / C ++可能带给您的主要危险之一。确保你不要做这样的事情,因为你正在调用“未定义的行为”,它可以做任何事情,从“不引起任何问题和看似工作”到“可怕的崩溃并以危险的方式降低你的操作系统”。 / p>