转:C++学习笔记之——vector的size和capacity、resize和reserve的区别

https://blog.csdn.net/huangjh2017/article/details/73928176

在使用STL中的vector时,对于size和capacity、resize和reserve的使用很是模糊。于是这篇博文就诞生了,主要是加深自己的理解和方便日后查阅。

在vector中size()和capacity()属性分别对应着resize(size_type)和reserve(size_type)这两个方法。

为此,我们先来看看size()和capacity()属性的区别:

  • size: 表示实际容器中保存元素的个数
  • capaciy: 表示在发生重新分配之前允许存放多少元素
弄清楚了这两个概念,我们再来看看对应的resize(size_type)和reserve(size_type)这两个方法:
  • resize(size_type): 对某个vector容器调用resize方法会在该容器尾部添加或删除一些元素,使容器达到指定的大小。
  • reserve(size_type): 对某个vector容器调用reserve方法仅仅设置capacity这个值。
注意:reserve(size_type)只是改变了capaciy的值,此时这些内存空间可能还是“野”的。如果使用[]操作符进行访问,可能出现数组越界问题。

下面,我们给出一些测试程序来说明:
[cpp]  view plain  copy
  1. #include   
  2. #include   
  3.   
  4. using namespace std;  
  5.   
  6. int main(void)  
  7. {  
  8.     vector<int> vecSize;  
  9.     vector<int> vecCapacity;  
  10.   
  11.     vecSize.resize(2);  
  12.     cout << "vecSize.size() = " << vecSize.size() << ", vecSize.capacity() = "<< vecSize.capacity() <
  13.   
  14.     vecCapacity.reserve(2);  
  15.     cout << "vecCapacity.size() = " << vecCapacity.size() << ", vecCapacity.capacity() = " << vecCapacity.capacity() << endl;  
  16.   
  17.     return 0;  
  18. }  
输出如下:
[cpp]  view plain  copy
  1. vecSize.size() = 2, vecSize.capacity() = 2  
  2. vecCapacity.size() = 0, vecCapacity.capacity() = 2  
从输出结果我们可以看出resize方法会使vector容器拥有指定个数的元素,而reserve只是改变capaciy的值。
接下来我们来看看下个例子:
[cpp]  view plain  copy
  1. #include   
  2. #include   
  3.   
  4. using namespace std;  
  5.   
  6. int main(void)  
  7. {  
  8.     vector<int> vecSize;  
  9.     vector<int> vecCapacity;  
  10.   
  11.     vecSize.resize(2);  
  12.     vecCapacity.reserve(2);  
  13.   
  14.     //这里我们使用at函数来进行访问,at函数会进行下标越界检查  
  15.     vecSize.at(0) = 1;  
  16.     vecCapacity.at(0) = 2;  
  17.   
  18.     return 0;  
  19. }  
上面的测试程序在运行时会接收到std::out_of_range异常。这也说明了reserve只是改变capaciy的值此时这些内存空间可能还是“野”的。如果使用[]操作符进行访问,可能出现数组越界问题。
最后,我们在来看看resize方法对size和capacity的影响。
[cpp]  view plain  copy
  1. #include   
  2. #include   
  3.   
  4. using namespace std;  
  5.   
  6. int main(void)  
  7. {  
  8.     vector<int> vecInt;  
  9.     cout << "vecInt.size() = " << vecInt.size() << ", vecInt.capacity() = " << vecInt.capacity() << endl;  
  10.   
  11.     vecInt.resize(1024);  
  12.     cout << "vecInt.size() = " << vecInt.size() << ", vecInt.capacity() = " << vecInt.capacity() << endl;  
  13.   
  14.     vecInt.resize(1500);  
  15.     cout << "vecInt.size() = " << vecInt.size() << ", vecInt.capacity() = " << vecInt.capacity() << endl;  
  16.   
  17.     return 0;  
  18. }  
输出结果如下所示:
[cpp]  view plain  copy
  1. vecInt.size() = 0, vecInt.capacity() = 0  
  2. vecInt.size() = 1024, vecInt.capacity() = 1024  
  3. vecInt.size() = 1500, vecInt.capacity() = 1536  
这是vector的一个好处它的capacity()机制减少了内存分配的次数。等于说resize()还替我们做了reserve()的事。

你可能感兴趣的:(c++)