Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
一、先从size 和capacity 说起
resize(),设置大小(size);
reserve(),设置容量(capacity);
size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:买了一个新房子,新房子里可以放3张床reserve(3),这是说房子的容量是最多放3张床,但是屋里并不是有三张床,二resize(3),房里安装了3张床,此时房里的床可以使用了。
reserve为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。但reserve的功能确实蹩脚,只能用reserve是的capacity变得比之前大。
resize调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。
由于vector是顺序容器,在内存中分配了一块连续的存储空间。为了保证动态添加元素的高效率,因此必须预先为vector分配一段空间,这个空间就是capacity。
而容器中元素的个数就是size(),在容器中,capacity总是大于等于 size;
当vector数组插入数据量过大时,其capacity,会变得很大,且清空vector容器后,还会保留原分配的容量capacity。系统不会自动收回空间吗?真的不会!!!!
我们一点一点写程序把risize()跟reserve()弄那个明白。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.resize(5);
t.reserve(1);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.resize(20);
t.reserve(2000);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.resize(10000);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
运行结果

我们可以看出当Vector内只有五个元素时其分配空间还是1024,而reserve却不能做出任何反应,蹩脚,但是reserve能让容器空间变大,其实vector既然是容器他就会自动分配更多空间,所以reserve差评,这不是重点,重点是怎么将vector多分配出来的空间收回。有同学要说了clear()。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.clear();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
运行结果

然而clear只是将容器内的元素清空了,对于分配的capacity,却没有作用。在这里有几种方法实现降低容量 ,但是其原理相同。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.clear();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.shrink_to_fit();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
运行结果

当时我比较苦恼时大佬给我了两个方法,上面那个,还有一个底层的写法如下。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.clear();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
auto newt=t;
swap(newt,t);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
cout<<newt.size()<<' ';
cout<<newt.capacity()<<endl;

显然t容器已经被降低容量,但是其容量降低的代价时newt的容量变大。所以这种方法不可取。还有第三种方法。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.clear();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
vector<int>(t).swap(t);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;

以上就是对于vector的capacity的探究,当数据量较少时,多分配的capacity可以忽略,但是当数据量很大之后,就不能忽略了,所以当你clear之后记着shrink呀。
Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();的更多相关文章
- C++ STL中vector(向量容器)使用简单介绍
原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相 ...
- 条目二十三《考虑用排序的vector替代关联容器》
条目二十三<考虑用排序的vector替代关联容器> 在看到这个条目的标题的时候,说实话,我一下子是比较懵逼的.这个结论怎么和数据结构的时间复杂度不一致了? 一般来说,像map,set等关联 ...
- std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义
std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...
- 对vector和map容器的删除元素操作
/** * 删除头部元素 * 切割map到指定的个数 * @param map * @param i * @return */ map<int, Rect> PublicCardFrame ...
- http400错误基本都是http请求参数与服务器接收参数不匹配
http400错误基本都是http请求参数与服务器接收参数不匹配造成的, 如:1)post请求,你发了个get请求 2)content-type指定不匹配致使参数无法读出来
- 【转】C++ Vector(向量容器)
转自:https://blog.csdn.net/studentyyl/article/details/21177445 vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩 ...
- C++——STL之vector, list, deque容器对比与常用函数
STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...
- 利用swap技巧去除容器多余的容量
假设我们预先为容器添加了一部分元素,接着用clear将它们删除,容器内部分配的存储空间实际上不会减小,改变的只是能够访问的元素个数.如下所示: std::vector<int> vec; ...
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
随机推荐
- python3的subprocess的各个方法的区别(-)
subprocess(python3.7) subprocess 主要是为了替换一下的模块函数,允许你执行一些命令,并获取返回的状态码和 输入,输出和错误信息. os.systemos.spawn* ...
- 插入排序(C语言版)
#include<iostream>using namespace std;int n;void lan(int a[],int size){ for(int i = 0;i < s ...
- Date 对象-->概念、创建以及方法
1.概念: Date 对象用于处理日期与时间. 2.创建: 方法1:直接用Date()函数,返回值当前时间 格式:var d = Date(); 注意:不论Date()是否带参数,返回都是当前时间 举 ...
- 再探CI,Github调戏Action手记——自动构建并发布到另一仓库
前言 接上文初探CI,Github调戏Action手记--自动构建并发布 在学习了Action的基本操作之后 接着我们来探索Action其他可能的功能 众所周知 只有用得到的技术学习的才会最快 我也是 ...
- 记一次pgsql中查询优化(子查询)
记一次pgsql的查询优化 前言 这是一个子查询的场景,对于这个查询我们不能避免子查询,下面是我一次具体的优化过程. 优化策略 1.拆分子查询,将需要的数据提前在cte中查询出来 2.连表查询,直接去 ...
- leetcode c++做题思路和题解(5)——堆的例题和总结
堆和优先队列 堆的简介, 是一种二叉树, 有最大堆和最小堆miniheap. 通常用于构建优先队列. 0. 目录 数据流中的第K大元素 1. 数据流中的第K大元素 数据流中的第K大元素 复杂度为log ...
- Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统
Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手 来源: 博客园 发布时间: 2011-04-19 11:18 阅读: 1282 次 推荐: 0 ...
- string 从下标0 一直截到倒数第三位
StringUtils.substring(String.valueOf(maxSequence), 0, -3)如上,关键就是那个-3,表示倒数第三位.
- Netty 中的异步编程 Future 和 Promise
Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...
- 新手想掌握Python技能需要众多Python项目练习,适合项目有哪些?
适合新手练习的Python项目有哪些?简单易上手的Python项目汇总:Web 项目设计:内容聚合器.正则表达式查询工具.网址缩短.便利贴.功能.测验.GUI 项目设计:MP3 播放器.闹铃提醒工具. ...