Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矢量擦除和插入方法在引擎盖下做什么?_C++_Vector - Fatal编程技术网

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,因此它可以保证最后插入和删除的摊销固定时间。不需要在每次插入和删除时重新分配和复制/移动所有内容,这样更为实用。