STL vector的几种清空容器(删除)办法
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的几种清空容器(删除)办法相关推荐
- C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)
1. vector 特点 vector 是一个模板类,提供了动态数组的通用功能,具有如下特点: 在数组末尾添加元素所需的时间是固定的,即在末尾插入元素的所需时间不随数组大小而异,在末尾删除元素也如此: ...
- STL vector 容器介绍
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- STL vector容器
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用. ...
- STL vector 容器介绍 (转载)
STL vector 容器介绍<?xml:namespace prefix = o /> A Presentation of the STL Vector Container (By Ni ...
- STL容器删除元素的陷阱
今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下: std::vector< ...
- Linux 下清空或删除大文件内容的 5 种方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 下面的这些方法都是从命令行中达到清空文件的目的. 使用名为 access.log 的文件作为示例样本 ...
- 用linux命令清空文件夹,技能包!Linux 下清空或删除大文件内容的 5 种方法
导读 在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何Linux命令行编辑器 去打开这些文件.那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清 ...
- 【C++】STL——vector的模拟实现
vector的模拟实现 文章目录 vector的模拟实现 一.vector模拟实现总览 二.模拟实现vector函数接口 1. 默认成员函数 1.1. 构造函数 1.2. 析构函数 1.3.拷贝构造函 ...
- C++ stl vector介绍
转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if ...
最新文章
- 自定义国内maven镜像包设置settings.xml
- 将输入的中文按要求翻译成拼音
- 基于visual Studio2013解决C语言竞赛题之1081shell排序
- github 地图上画区域的工程_筑工程测量区别
- 把Eclipse项目转换成Maven项目
- Oracle的ha模式启停,数据库oracle 11g 的启停操作
- 02函数-03-闭包
- 一线大厂青睐的前端人,90%满足这3个条件
- 双稳态继电器工作原理图_三招带你分清继电器与接触器
- 慢慢看Spring源码
- Ajax专题:异步交互局部刷新初步
- 坑nyoj1088 just do it
- Hbase安装教程详解
- garmin 945_点评:Garmin Nuvi 350 GPS
- AD15复制相同模块布局
- Win7部署Web网站之IIs安装篇
- php 实现游戏开发
- Sharepoint 中的CAML 语言
- 具有跳跃性思维的算法
- Codeforces 439 A. Devu, the Singer and Churu, the Joker