Backto C/C++ Index
vector 是 C++ 中最常用的容器, 一方面用来替代 C 中的数组, 另一方面引入了 C++ STL 风格的通用功能, 很酷很强大. 但同时也要注意两种风格混用的时候, 容易出问题.
初始化
数组方式: 给定容量 + 下标访问
vector<int> vec(5); // sameto => int arr[5]; but vec will be initalized as [0,0,0,0,0]
vector<int> vec(3, -1); // vec will be initalized as [-1,-1,-1]
int arr[5] = {1,2,3,4,5}
vector<int> vec(arr, arr+4); // copy elems from array
STL 风格
// copy & assignment constructors
vector<int> vec1;
vector<int> vec2(vec1);
vec3 = vec1;
// add elem one by one
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
混用
vector<int> vec(5)
vec.push_back(5);
注意此时的 vec 内容是 0,0,0,0,0,5
.
访问
访问的时候就会涉及到 vector 的 capacity
和 size
, size
是 vector 中当前存储的真实元素的个数, capacity
是 vector 当前可存储的最大元素个数. vector 支持动态扩容, 初始 capacity=4, size=0
; 当 size=4
且再push_back 进去元素时, vector 会自动翻倍扩容并且把之前的元素按顺序 copy 过去, 再添加新元素. 这一步扩容非常耗时耗空间, 所以, 最好在初始化时候就给定大小.
数组方式: 通过下标
vec[2];
STL 风格: 通过迭代器
iterator
是标准库中的类,它具有指针的功能
*it
: 对迭代器解引用,并访问其指向的实际对象
++it
: 向前移动迭代器 it 使其指向下一个元素
vector<int>::iterator iter = vec.begin();
for(;vec!= vec.end();++iter)
cout << *iter << endl;
混用
有时候已知大小, 但是又需要依次 push_back的话, 可以这样
vector<int>::iterator vec(100);
vector<int> iter = vec.begin();
for(...)
... *iter++ ...