您的位置:首页 > 其它

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返回的迭代器。还有,对于插入某个元素,更是有可能因重新分配空间导致迭代器等失效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐