C++ 为什么不在GotW 54中调整大小并清除工作?

C++ 为什么不在GotW 54中调整大小并清除工作?,c++,vector,deque,gotw,C++,Vector,Deque,Gotw,参考赫布萨特的文章,他解释了 “收缩到适合”a的正确方法 向量或deque和 完全清除向量或 德克 我们可以只使用container.resize() 和container.clear()用于上述任务 还是我遗漏了什么 向量包含两种不同的内容:sizeVscapacity。如果只调整向量的大小,则无法保证容量(保留的内存量)必须更改调整大小是一项与使用多少有关的操作,而不是向量容量的多少 比如说 size == how much you are using capacity == how

参考赫布萨特的文章,他解释了

  • “收缩到适合”a的正确方法 向量或deque和

  • 完全清除向量或 德克

  • 我们可以只使用
    container.resize()
    container.clear()
    用于上述任务 还是我遗漏了什么


    向量包含两种不同的内容:
    size
    Vs
    capacity
    。如果只调整向量的大小,则无法保证容量(保留的内存量)必须更改<代码>调整大小是一项与使用多少有关的操作,而不是向量容量的多少

    比如说

    size     == how much you are using
    capacity == how much memory is reserved
    vector<int> v(10);
    
    v.resize(5); // size == 5 but capacity (may or may) not be changed
    v.clear()    // size == 0 but capacity (may or may) not be changed
    
    size==您正在使用的数量
    容量==保留的内存量
    向量v(10);
    v、 调整大小(5);//大小==5,但容量(可能或可能)不变
    v、 clear()//大小==0,但容量(可以更改,也可以不更改)
    

    最后,容量不应该在每个操作上都改变,因为这将带来大量内存分配/释放开销。他是说,如果您需要按向量“解除分配保留的内存,请这样做。

    向量具有大小和容量。它可能包含X个元素,但存储了Y个元素的未初始化内存。在一个典型的实现中,擦除、调整大小(当调整到较小的大小时)和清除不会影响容量:如果您以后想向向量中添加新的项,则向量本身会保留内存。

    调整大小()和清除()都不起作用。向量的
    .capacity()
    保证至少与向量的当前
    size()
    一样大,并且保证至少与
    reserve()
    d容量一样大。此外,这个。
    capacity()
    不会收缩,因此它至少与以前的任何
    size()
    reserve()一样大

    现在,向量的
    .capacity()
    仅仅是它保留的内存。通常并非所有的记忆都包含对象。调整大小会删除对象,但不会回收内存。当分配较大的缓冲区时,向量只能回收其内存缓冲区


    交换技巧的工作原理是将所有对象复制到更小、更合适的内存缓冲区。之后,可以回收原始内存缓冲区。这似乎违反了前面的语句,即向量的内存缓冲区只能增长。但是,使用交换技巧,您暂时拥有2个向量。

    我认为容量也会改变:-(请注意,即使将向量调整为更大的大小,容量也可能不会改变,因为可能只有足够的内存来处理新的(更大的)大小。