11.Vector如何释放空间?

11.Vector如何释放空间?

由于vector的内存占用空间只增不减,比如你首先分配了10000个字节,然后erase掉后面9999个,留下一个有效元素,但是内存占用仍为10000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。

如果需要空间动态缩小,可以考虑使用deque。

如果使用vector,可以用swap()来帮助你释放多余内存或者清空全部内存。

vector(Vec).swap(Vec); //将Vec中多余内存清除; 
vector().swap(Vec); //清空Vec的全部内存;

当使用vector(Vec).swap(Vec)这样的语句时,它实际上执行了以下步骤:

  1. 创建临时vector对象:vector(Vec)会创建一个临时的vector对象,其中的元素是拷贝自Vec的元素,但临时vector并不会预留多余的内存空间。也就是说,临时vector的容量(capacity)与实际存储的元素个数(size)相同,没有多余的内存空间。

  2. swap函数交换内容:Vec和临时vector的内容进行了交换,也就是它们的指针和容量等信息进行了交换。这个交换是非常高效的,因为swap只交换了指针,而没有真正移动元素。

  3. 临时vector析构:在整个语句执行完毕后,临时vector对象会被立即析构,因为它是在这个语句的作用域中创建的。在析构时,临时vector会释放它所持有的内存空间。由于临时vector的容量和实际存储的元素个数相同,所以这里释放的就是Vec之前的多余内存。

让我们通过一个例子来说明这个过程:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> Vec;
    for (int i = 1; i <= 10; ++i)
    {
        Vec.push_back(i); // 添加元素1-10到Vec
    }

    std::cout << "Vec Size: " << Vec.size() << ", Capacity: " << Vec.capacity() << std::endl; // 输出 Size: 10, Capacity: 16

    // 使用 vector(Vec).swap(Vec) 释放多余内存
    std::vector<int>(Vec).swap(Vec);

    std::cout << "Vec Size: " << Vec.size() << ", Capacity: " << Vec.capacity() << std::endl; // 输出 Size: 10, Capacity: 10

    return 0;
}

在这个例子中,一开始Vec的容量是16(这是一个比实际存储元素个数大的值,用于提高效率)。通过vector(Vec).swap(Vec)语句后,Vec的容量变为10,说明多余的内存被成功释放了。

vector().swap(Vec);语句中,vector()创建了一个空的临时vector对象,然后通过swap函数将Vec和这个临时vector的内容进行交换。结果Vec变为空,同时释放了所有之前的内存。

需要注意的是,这两种方法只能释放vector多余的内存,而不能释放vector中元素本身可能占用的动态分配的内存。例如,如果vector中存储的是指向动态分配对象的指针,那么这些动态分配的对象的内存需要单独释放。

实例

#include <iostream>
#include <vector>
using namespace std;

int main ()
{
    vector<int> vec (100,100);   // three ints with a value of 100
    vec.push_back(1);
    vec.push_back(2);
    cout <<"vec.size(): " << vec.size() << endl;
    cout <<"vec.capacity(): " << vec.capacity() << endl;

    vector<int>(vec).swap(vec); //清空vec中多余的空间,相当于vec.shrink_to_fit();

    cout <<"vec.size(): " << vec.size() << endl;
    cout <<"vec.capacity(): " << vec.capacity() << endl;

    vector<int>().swap(vec); //清空vec的全部空间

    cout <<"vec.size(): " << vec.size() << endl;
    cout <<"vec.capacity(): " << vec.capacity() << endl;

    return 0;
}

输出:

运行结果:
vec.size(): 102
vec.capasity(): 200
vec.size(): 102
vec.capasity(): 102
vec.size(): 0
vec.capasity(): 0
posted @ 2023-08-02 22:43  CodeMagicianT  阅读(216)  评论(0编辑  收藏  举报