您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: