Vector的注意事项(大小与容量)
2011-03-10 20:37
225 查看
标准模板库(STL)的所有容器中,Vector可以说是最容易上手、最容易理解的容器。不过,Vector也有好些值得我们注意的地方。
众所周知,Vector是一个可以容纳动态长度的容器。为了高效地运用Vector,应该了解Vector大小(size)和容量(capacity)的关系:Vector之中用于操作大小的函数有size()、empty()等,另一个与大小有关的函数是capacity(),它返回Vector实际能够容纳的元素数量。如果超出这个数量,Vector就有必要重新配置内部存储器。
Vector的容量之所以重要,主要有两个方面的原因:
1. 一旦内存重新配置,和Vector元素相关的所有reference、pointers、iterators都会失效;
2. 内存重新配置很耗时间。
当然,你可以通过使用reserve()函数预留相当大的容量,以避免一再重新配置内存。只要保留的容量足够大,就不用担心references等会失效。
std::vector<int> v;
v.reserve(100);
另一种避免重复配置内存的方法是:std::vector<T> v(5);不过这种方法,对基本型别效率和上一相似,如果元素型别是自定义的类型,此类型就必须提供一个default构造函数(自定义型别在初始化操作的时候很耗时, 不如reserve)。
几点注意事项:
1. Vector的容量不会缩减,即使使用clear()函数,清空Vector的所有元素,Vector的真正占用内存不会减少。不过有一个缩减Vector容量的小窍门:两个Vector交换内容后,两者的容量也会互换。现有Vector V;
std::vector<int> tmp;
V.swap(tmp); // 这样tmp就和V交换了容量
或者:
V.swap(std::vector<int>() ); // 和一个临时Vector交换
2. 慎用Vector:Vector本身就占用一定的内存,即使不向其中添加任何元素。
std::vector<int> tmp;
int a = sizeof(tmp); // 可以看到a的值为20(当然这个值根据不同的系统与环境有关,我的VS2008+win7)
甚至,在许多实作方案中,容量的增长幅度比我们料想的还大。事实上为了防止内存破碎,在许多实作方案中即使不调用reserve(),当第一插入元素时也会一口气配置整块内存(如2K)。如果有一大堆Vectors,每个Vector的实作元素却寥寥无几,那么浪费的内存会相当可观。切记!!慎用Vector
众所周知,Vector是一个可以容纳动态长度的容器。为了高效地运用Vector,应该了解Vector大小(size)和容量(capacity)的关系:Vector之中用于操作大小的函数有size()、empty()等,另一个与大小有关的函数是capacity(),它返回Vector实际能够容纳的元素数量。如果超出这个数量,Vector就有必要重新配置内部存储器。
Vector的容量之所以重要,主要有两个方面的原因:
1. 一旦内存重新配置,和Vector元素相关的所有reference、pointers、iterators都会失效;
2. 内存重新配置很耗时间。
当然,你可以通过使用reserve()函数预留相当大的容量,以避免一再重新配置内存。只要保留的容量足够大,就不用担心references等会失效。
std::vector<int> v;
v.reserve(100);
另一种避免重复配置内存的方法是:std::vector<T> v(5);不过这种方法,对基本型别效率和上一相似,如果元素型别是自定义的类型,此类型就必须提供一个default构造函数(自定义型别在初始化操作的时候很耗时, 不如reserve)。
几点注意事项:
1. Vector的容量不会缩减,即使使用clear()函数,清空Vector的所有元素,Vector的真正占用内存不会减少。不过有一个缩减Vector容量的小窍门:两个Vector交换内容后,两者的容量也会互换。现有Vector V;
std::vector<int> tmp;
V.swap(tmp); // 这样tmp就和V交换了容量
或者:
V.swap(std::vector<int>() ); // 和一个临时Vector交换
2. 慎用Vector:Vector本身就占用一定的内存,即使不向其中添加任何元素。
std::vector<int> tmp;
int a = sizeof(tmp); // 可以看到a的值为20(当然这个值根据不同的系统与环境有关,我的VS2008+win7)
甚至,在许多实作方案中,容量的增长幅度比我们料想的还大。事实上为了防止内存破碎,在许多实作方案中即使不调用reserve(),当第一插入元素时也会一口气配置整块内存(如2K)。如果有一大堆Vectors,每个Vector的实作元素却寥寥无几,那么浪费的内存会相当可观。切记!!慎用Vector
相关文章推荐
- S3C245x SLC FLASH 更换容量大小需要注意
- C++中vector中erase用法注意事项
- Android Studio使用Vector Asset的注意事项
- IIS7下配置最大上传附件大小需要注意的事项
- vector中erase用法注意事项
- 解决比较Sql中的数字字符串大小时的注意事项
- vector中erase用法注意事项
- vector大小与容量的关系
- 关于 vector 中 erase 函数的使用注意事项
- std::vector的一些使用注意事项
- vector的 emplace 和 insert 以及使用vector进行iterator遍历 且 erase的时候注意事项
- vector 的注意事项 (poj2195 小人进房子 最小费用最大流)
- std::vector的一些使用注意事项
- 提前为部署MongoDB做好准备:容量计划和监控、注意事项
- Android中,字体大小自适应不同分辨率,以及注意事项
- vector,map 注意事项
- c++中的二维vector注意事项(object向c++转型系列教程3)
- C++中vector的用法及注意事项
- 【C++注意事项】7 Library vector Type
- vector中的erase注意事项