1、为什么需要主动释放vector内存

来自 <https://blog.csdn.net/hellokandy/article/details/78500067>

vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。

在调用push_back时,每次执行push_back操作,相当于底层的数组实现要重新分配大小;这种实现体现到vector实现就是每当push_back一个元素,都要重新分配一个大一个元素的存储,然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存。

2、怎么释放vector的内存

来自 <https://blog.csdn.net/hellokandy/article/details/78500067>

A、对于数据量不大的vector,没有必要自己主动释放vector,一切都交给操作系统。

B、但是对于大量数据的vector,在vector里面的数据被删除后,主动去释放vector的内存就变得很有必要了!

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

clear使用之后,并不能清空数据,其数据再未被覆盖之前是不会改变的,个人猜测clear仅仅把指针挪动到了起始位置。

#include <iostream>#include <vector>using namespace std;//STL vector的几种清空容器(删除)办法void test(){vector<int> vecnum;vecnum.push_back(1);vecnum.push_back(2);vecnum.push_back(3);vecnum.push_back(4);vecnum.push_back(5);vecnum.push_back(6);vecnum.push_back(7);//打印vector的大小和容量cout << "old: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;//1. clear(),清空元素,但不回收空间vecnum.clear();cout << "new1: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;//2. 使用 erase循环删除,结果同上vector<int>::iterator it;for (it = vecnum.begin(); it != vecnum.end(); ){//注意使用erase()方法时,迭代不要随意的++it = vecnum.erase(it);}cout << "new2: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;//结论:erase在每次操作时,迭代器指针会整体前移1,就是每次都会移动全部数据,所以vector不适合做频繁删除的容器//3. 最简单的使用swap,清除元素并回收内存vector<int>().swap(vecnum);//打印vector的大小和容量cout << "new2: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;}int main(){test();getchar();return 0;}

运行结果

STL vector的几种清空容器(删除)办法相关推荐

  1. C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)

    1. vector 特点 vector 是一个模板类,提供了动态数组的通用功能,具有如下特点: 在数组末尾添加元素所需的时间是固定的,即在末尾插入元素的所需时间不随数组大小而异,在末尾删除元素也如此: ...

  2. STL vector 容器介绍

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  3. STL vector容器

    介绍  这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用. ...

  4. STL vector 容器介绍 (转载)

    STL vector 容器介绍<?xml:namespace prefix = o /> A Presentation of the STL Vector Container (By Ni ...

  5. STL容器删除元素的陷阱

    今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下: std::vector< ...

  6. Linux 下清空或删除大文件内容的 5 种方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 下面的这些方法都是从命令行中达到清空文件的目的. 使用名为 access.log 的文件作为示例样本 ...

  7. 用linux命令清空文件夹,技能包!Linux 下清空或删除大文件内容的 5 种方法

    导读 在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何Linux命令行编辑器 去打开这些文件.那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清 ...

  8. 【C++】STL——vector的模拟实现

    vector的模拟实现 文章目录 vector的模拟实现 一.vector模拟实现总览 二.模拟实现vector函数接口 1. 默认成员函数 1.1. 构造函数 1.2. 析构函数 1.3.拷贝构造函 ...

  9. C++ stl vector介绍

    转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if ...

最新文章

  1. 自定义国内maven镜像包设置settings.xml
  2. 将输入的中文按要求翻译成拼音
  3. 基于visual Studio2013解决C语言竞赛题之1081shell排序
  4. github 地图上画区域的工程_筑工程测量区别
  5. 把Eclipse项目转换成Maven项目
  6. Oracle的ha模式启停,数据库oracle 11g 的启停操作
  7. 02函数-03-闭包
  8. 一线大厂青睐的前端人,90%满足这3个条件
  9. 双稳态继电器工作原理图_三招带你分清继电器与接触器
  10. 慢慢看Spring源码
  11. Ajax专题:异步交互局部刷新初步
  12. 坑nyoj1088 just do it
  13. Hbase安装教程详解
  14. garmin 945_点评:Garmin Nuvi 350 GPS
  15. AD15复制相同模块布局
  16. Win7部署Web网站之IIs安装篇
  17. php 实现游戏开发
  18. Sharepoint 中的CAML 语言
  19. 具有跳跃性思维的算法
  20. Codeforces 439 A. Devu, the Singer and Churu, the Joker

热门文章

  1. 想不明白的时候可以干的十件事情
  2. VC(MFC、ATL)中 得到2个SYSTEMTIME时间差
  3. 填坑-十万个为什么?(22)
  4. 一个word文档中,多个表格的批量调整(根据窗口调整表格和添加表格水平线)...
  5. 数据库几种连接方式的(左右union all)
  6. 如何使用批处理添加网络打印机
  7. poj 3257(哈希+二维dp)
  8. poj - 2356 Find a multiple
  9. Spring Cloud笔记
  10. NYOJ 915 +-字符串