vector的基本使用
1 2 3 4 5 6 7 8 9 10
| vector<int> v; vector<char> v2; vector<string> v3;
vector<int> v4(10, 5);
string s2 = "0123456789"; vector<char> v5(s2.begin(), s2.end());
vector<char> v6(v5);
|
vector的遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| string s = "0123456789"; vector<char> v(s.begin(), s.end()); vector<char>::iterator it = v.begin(); while(it != v.end()) { cout << *it << " "; *it = 'a'; it++; } cout << endl;
for(char& ch : v) { cout << ch << " "; ch = 'b'; } cout << endl;
for(int i = 0; i < v.size(); i++) { cout << v[i] << " "; v[i] = 'c'; } cout << endl;
for(auto& ch : v) { cout << ch << " "; }
|
1 2 3 4 5 6 7 8 9
| string s = "0123456789"; vector<char> v(s.begin(), s.end());
vector<char>::reverse_iterator rit = s.rbegin(); while(rit != s.rend()) { cout << *rit << " "; rit++; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| template <class T> void printVec(const vector<T>& v) { vector<T>::const_iterator cit = v.cbegin(); while(it != c.cend()) { cout << *cit << " "; cit++; } cout << endl; vector<T>::const_reverse_iterator it = v.crbegin(); while(crit != c.crend()) { cout << *icrt << " "; crit++; } cout << endl; }
|
operator[ ]
遍历越界,调试版本产生断言错误
at( )
遍历越界,抛异常
vector容量
resize(n, val)
:如果不给val参数,则使用默认值:内置类型 —-> 0;自定义类型 —-> 调用无参构造
vector修改操作
insert()
插入,==参数需要迭代器==,在pos之前插入元素
erase()
删除pos之前的数据
1 2 3 4 5 6
| vectot<int> v; v.insert(v.begin(), 1); v.insert(v.begin(), 5, 0); int a[] = {1, 2, 3, 4, 5}; v.insert(v.begin(), a + 1, a + 3); v.erase(begin());
|
push_back()
尾插;·pop_back()
尾删
1 2 3 4
| vector<int> v v.push_back(1); v.push_back(2); v.pop_back();
|
==迭代器失效问题==:迭代器指向的位置,空间被释放或者变成一个不可访问的位置
- 空间发生了变化,就会导致原来的迭代器失效 —-> push_back, insert, reserve, resize, assign
- 位置错位 —-> erase
解决方案:
- 重新获取迭代器
- 非删除接口:begin,end
- erase:直接获取其返回值,其返回值指向被删除元素的下一个元素的迭代器。潜在的问题:如果传入的迭代器为最后一个元素的迭代器,获取的返回值为end迭代器,也是一个不能访问的位置
emplace
、emplace_back
插入(更高效)
1 2 3 4 5 6 7 8 9 10
| vector<B> v; B b(1, 2); v.insert(v.begin(), b); v.emplace(v.begin(), 3, 4); B b2(5, 6); v.emplace(v.begin(), b2);
v.push_back(b2); v.emplace_back(b); v.emplace_back(7, 8);
|
vector的实现
start
finish
end_of_storage
T * 类型
start
空间的首地址,第一个元素的首地址
finish
最后一个元素的结束位置
end_of_storage
空间的结束位置
vector的模拟实现GitHub链接