vector 内存缩小与释放

14 篇文章 0 订阅

        vector 相比于数组好用得多,最重要一点是在往 vector 添加元素时,vector 会自动增加所需要的内存,看源码可知它是以 2 倍于当前元素大小进行增加。但这样也存在珍上问题,在你增加元素后,vector 所占内存逐渐增加,即使我们使用 clear() 其内存也是不会释放的,直到 vector 变量释放时,其所占内存才会被释放。

        若要手动释放内存,我们可以调用 swap() 。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <iomanip>
#include <algorithm>

void printVec(const std::vector<std::string> &vec);
int main()
{
    std::vector<std::string> strVec;
    strVec.push_back("uface");
    strVec.push_back("904147139");
    strVec.push_back("247412");
    strVec.push_back("handshake");

    //添加一个作用域
    {
        std::vector<std::string> tmpVec; //一个空的vector
        strVec.swap(tmpVec); //交换后,strVec变成空的了
        printf("size of tmpVec = %lu, tmpVec = %lu\n", tmpVec.size(), tmpVec.capacity()); 
    }

    printf("size of strVec = %lu, capacity = %lu\n", strVec.size(), strVec.capacity());
    printVec(strVec);
    return 0;
}

void printVec(const std::vector<std::string> &vec)
{
    for(auto ite : vec)
    {
        printf("%s\n", ite.c_str());
    }
}

 若只是减少内存而不是释放呢,其实我们可以调用 shrink_to_fit() 接口,该接口会将容器占用的内存缩小到合适的大小。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <iomanip>
#include <algorithm>

void printVec(const std::vector<std::string> &vec);
int main()
{
    std::vector<std::string> strVec;
    strVec.reserve(20);
    strVec.push_back("uface");
    strVec.push_back("904147139");
    strVec.push_back("247412");
    strVec.push_back("handshake");
    printf("size of strVec = %lu, capacity = %lu\n", strVec.size(), strVec.capacity());

    strVec.shrink_to_fit();
    printf("size of strVec = %lu, capacity = %lu\n", strVec.size(), strVec.capacity());
    
    printVec(strVec);
    return 0;
}

void printVec(const std::vector<std::string> &vec)
{
    for(auto ite : vec)
    {
        printf("%s\n", ite.c_str());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值