vector的 []

摘自《C++编程剖析》

 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     vector<int> v;
 9     v.reserve(2);
10     v[0] = 1;
11     v[1] = 2;
12 
13     cout << v[0] << endl;
14 
15     v.reserve(100);
16     cout << v[0] << endl;
17 }

输出

jingyg@jingyg:~/share/mytest/cpp_test$ g++ -std=c++11 test.cpp 
jingyg@jingyg:~/share/mytest/cpp_test$ ./a.out 
1
0

为什么会这样?
只可以使用 operator[]()(或 at())去改动那些确实存在于容器中的元素。

v.reserve(2) 仅仅保证 vector 的容量至少为 2,并不会创建元素。而 v[0] = 1; 也不会创建第一个元素。只是恰好 v[0] 简单返回了用于存放但尚未存放第一个元素的那块空间的引用。

但是对于 vector 容器而言,它还是空的。当使用 v.reserve(100) 重新分配时,v 会把确实存在的元素复制到新的内存中,所以新的内存中 v[0] 初始值为 0 (严格讲不确定)。

把 reserve 改成 resize 可以保证正常工作。因为 resize会在容器的尾部添加或删除一些元素。

 

总结:

  • 不要用 [] 来添加新的元素,[] 只可以改确实存在的元素,应使用 push_back() 添加新元素
  • size和resize,capacity和reserve 两种不同的概念
  • 如果需要越界检查,可以使用 at(),会抛出 std::out_of_range异常
posted @ 2016-07-25 13:54  Kjing  阅读(215)  评论(0编辑  收藏  举报