vector大小与容量的关系
2015-01-25 15:07
281 查看
vector优异性能的秘诀之一,就是配置比其所容纳的元素所需更多的内存。
vector中的函数capacity()返回vector实际能够容纳的元素数量,如果超出这个数量,vector就会重新配置内部存储器。一旦内存重新分配,和vector相关的所有引用、迭代器、指针都会失效,而重新分配这些有很耗时间,所以如果需要速度的场景下,vector容量需要考虑。
可以使用reserve()来保留适当容量,避免重新分配。也可以在初始化期间向构造函数传递附加参数,构造足够空间,但是如果类型本身很复杂,构造也会特别耗时间,所以如果只是保留内存,建议用reserve()。
如果调用reserve()所给参数比当前vector容量小,则不会有任何反应。
另外很多实现,就算你只插入1个元素,也会分配一段内存,如果大量vector只有零散元素,则会比较浪费内存。在VS2005下实验以下代码,由此也可看出不同平台有不同实现规律
std::vector<int> vec_int(1024);
int capa = vec_int.capacity(); // 1024
vec_int.push_back(1);
capa = vec_int.capacity(); //1536 增加了512个整型空间,2K字节
std::vector<int> vec_int(128);
int capa = vec_int.capacity();//128
vec_int.push_back(1);
capa = vec_int.capacity();//192 增加64个整型空间
最后,vector迭代器持续有效,除非发生两种情况:1、使用者在一个较少位置插入和移除元素;2、由于容量变化而重新分配内存。
当然,删除某个元素后,再使用原来的迭代器是危险的(在vs2005调试版本会抛出异常),需要避免这样使用,应该使用erase返回的迭代器。还有,对于插入某个元素,更是有可能因重新分配空间导致迭代器等失效。
vector中的函数capacity()返回vector实际能够容纳的元素数量,如果超出这个数量,vector就会重新配置内部存储器。一旦内存重新分配,和vector相关的所有引用、迭代器、指针都会失效,而重新分配这些有很耗时间,所以如果需要速度的场景下,vector容量需要考虑。
可以使用reserve()来保留适当容量,避免重新分配。也可以在初始化期间向构造函数传递附加参数,构造足够空间,但是如果类型本身很复杂,构造也会特别耗时间,所以如果只是保留内存,建议用reserve()。
如果调用reserve()所给参数比当前vector容量小,则不会有任何反应。
另外很多实现,就算你只插入1个元素,也会分配一段内存,如果大量vector只有零散元素,则会比较浪费内存。在VS2005下实验以下代码,由此也可看出不同平台有不同实现规律
std::vector<int> vec_int(1024);
int capa = vec_int.capacity(); // 1024
vec_int.push_back(1);
capa = vec_int.capacity(); //1536 增加了512个整型空间,2K字节
std::vector<int> vec_int(128);
int capa = vec_int.capacity();//128
vec_int.push_back(1);
capa = vec_int.capacity();//192 增加64个整型空间
最后,vector迭代器持续有效,除非发生两种情况:1、使用者在一个较少位置插入和移除元素;2、由于容量变化而重新分配内存。
当然,删除某个元素后,再使用原来的迭代器是危险的(在vs2005调试版本会抛出异常),需要避免这样使用,应该使用erase返回的迭代器。还有,对于插入某个元素,更是有可能因重新分配空间导致迭代器等失效。
相关文章推荐
- vector模板类之简单程序代码(初始化、迭代器、大小、容量以及删除等操作)
- c++积累(4):vector对象初始化和大小、容量
- 讨论标准模板库std::vector的容量/大小及其内存增量
- 容器大小的改变以及容器操作可能使迭代器失效、vector对象的容量变化
- 关于vector大小(size)和容量(capacity)总结
- block大小和分区最大容量单个文件最大容量的关系
- Vector的注意事项(大小与容量)
- 如何获取SQL Server数据库里表的占用容量大小...
- 关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析
- TCP中带宽时延积与窗大小的关系
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
- Android中图片大小和屏幕密度的关系讲解
- ArrayList、Vector、HashMap、HashTable、HashSet的默认初始容量、加载因子、扩容增量、具体区别
- ArrayList、Vector、HashMap、HashTable、HashSet的默认初始容量、加载因子、扩容增量
- 输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR
- 【温故而知新】C++中类的大小与其继承关系
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小
- JAVA--第九周实验--判断两个日期的大小关系(内测版)
- swap 去除vector多余的容量
- 第26贴:滤波电容容量与输出电流的关系