摘自《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异常