C++ 矢量擦除和插入方法在引擎盖下做什么?
在一个非常低的层次上,这些方法到底在做什么 因为我注意到了一些奇怪的行为,例如,如果我有一个包含元素的向量C++ 矢量擦除和插入方法在引擎盖下做什么?,c++,vector,C++,Vector,在一个非常低的层次上,这些方法到底在做什么 因为我注意到了一些奇怪的行为,例如,如果我有一个包含元素的向量 2, 4, 6, 8 我说myVector.erase(myVector.begin()+1),它给我 2, 6, 8, 8 但是,如果我接着说myVector.insert(myVector.begin+1,3),它给了我 2, 3, 6, 8 我没有得到任何重复的元素。这些方法是如何在幕后实施的 编辑:代码 vector<int> v; v.push_back(2)
2, 4, 6, 8
我说myVector.erase(myVector.begin()+1)代码>,它给我
2, 6, 8, 8
但是,如果我接着说myVector.insert(myVector.begin+1,3)代码>,它给了我
2, 3, 6, 8
我没有得到任何重复的元素。这些方法是如何在幕后实施的
编辑:代码
vector<int> v;
v.push_back(2);
v.push_back(4);
v.push_back(6);
v.push_back(8);
v.erase(v.begin() + 1);
cout << v[0] << v[1] << v[2] << v[3];
向量v;
v、 推回(2);
v、 推回(4);
v、 推回(6);
v、 推回(8);
v、 擦除(v.begin()+1);
cout最初向量有4个元素
2, 4, 6, 8
因此,它的大小等于4,容量(根据示例)也等于4
事后陈述
myVector.erase(myVector.begin() + 1);
myVector.insert(myVector.begin + 1, 3);
被擦除的元件4之后的所有元件都向左移动
2, 6, 8, 8
但现在大小等于3,但容量仍然等于4。该向量不会释放已分配数据块中未使用的内存
声明后再次
myVector.erase(myVector.begin() + 1);
myVector.insert(myVector.begin + 1, 3);
将所有图元向右移动以释放插入的泊松
2, 3, 6, 8
现在大小等于4,容量通常等于4
你可以用下面的方法来想象这个过程
#include <iostream>
int main()
{
int a[] = { 2, 4, 6, 8 };
size_t size = 4;
size_t capacity = 4;
std::cout << "size = " << size << ", capacity = " << capacity << std::endl;
std::cout << "current state of the array: ";
for ( size_t i = 0; i < size; i++ ) std::cout << a[i] << ' ';
std::cout << std::endl;
std::cout << "The memory occupied by the array: ";
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
// removing the element with index 1
size_t i = 1;
for ( ; i + 1 < size; i++ ) a[i] = a[i+1];
--size;
std::cout << "\nsize = " << size << ", capacity = " << capacity << std::endl;
std::cout << "current state of the array: ";
for ( size_t i = 0; i < size; i++ ) std::cout << a[i] << ' ';
std::cout << std::endl;
std::cout << "The memory occupied by the array: ";
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
// inserting the element with index 1 and value 3
i = 1;
int value = 3;
size_t j = size;
for ( ; j != i; j-- ) a[j] = a[j-1];
a[j] = value;
++size;
std::cout << "\nsize = " << size << ", capacity = " << capacity << std::endl;
std::cout << "current state of the array: ";
for ( size_t i = 0; i < size; i++ ) std::cout << a[i] << ' ';
std::cout << std::endl;
std::cout << "The memory occupied by the array: ";
for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl;
}
你应该把你的向量正确地打印出来。@ Ogen,你需要发布你的代码,因为你在删除了其中的4个元素之后,你就做了一些错误的事情。@ Ogen,C++不支持你的手,每次你做错事时都会给你一个明确的错误。这需要让所有不这样做的人为他们不使用的东西付费。如果您希望发生这种情况,可以启用标准库的“调试模式”或使用消毒剂。@Ogen If语句的开销很大。如果要检查边界,请使用at()
成员函数。因此,擦除实际上并不擦除任何内容,它只是将前导元素向后推一个?@Ogen您应该使用@Ogen。也许不是。它可能不是故意覆盖“已擦除”元素,但它确实会更改向量的大小(可能会重新分配底层存储)。在任何情况下,您的代码都会通过尝试访问一个不存在的元素来调用未定义的行为。@ParamagneticCroissant那么,如果您无法访问在容量范围内但不在大小范围内的元素,那么向量具有容量的意义何在?@Ogen,因此它可以保证最后插入和删除的摊销固定时间。不需要在每次插入和删除时重新分配和复制/移动所有内容,这样更为实用。