vector的基本使用
vector<int> v;
vector<char> v2;
vector<string> v3;
vector<int> v4(10, 5);//10个5
string s2 = "0123456789";
vector<char> v5(s2.begin(), s2.end());
vector<char> v6(v5);
vector的遍历
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 << " ";
}
- 反向迭代器
string s = "0123456789";
vector<char> v(s.begin(), s.end());
vector<char>::reverse_iterator rit = s.rbegin();
while(rit != s.rend())
{
cout << *rit << " ";
rit++;
}
- 只读迭代器
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容量
-
增容:如果为空,容量为0
PJ版本中增容按照大于1.5倍进行,SGI一般是2倍
resize(n, val):如果不给val参数,则使用默认值:内置类型 —> 0;自定义类型 —> 调用无参构造
-
data() 返回首地址指针
vector修改操作
- insert()插入,参数需要迭代器,在pos之前插入元素
- erase()删除pos之前的数据
vectot<int> v;
v.insert(v.begin(), 1);//1
v.insert(v.begin(), 5, 0);//000001
int a[] = {1, 2, 3, 4, 5};
v.insert(v.begin(), a + 1, a + 3);//23000001 表示左闭右开的范围(a + 1 , a + 3]
v.erase(begin());
- push_back()尾插;·pop_back()尾删
vector<int> v
v.push_back(1);
v.push_back(2);
v.pop_back();
迭代器失效问题:迭代器指向的位置,空间被释放或者变成一个不可访问的位置
- 空间发生了变化,就会导致原来的迭代器失效 —> push_back, insert, reserve, resize, assign
- 位置错位 —> erase
解决方案:
1.重新获取迭代器
2.非删除接口:begin,end
3.erase:直接获取其返回值,其返回值指向被删除元素的下一个元素的迭代器。潜在的问题:如果传入的迭代器为最后一个元素的迭代器,获取的返回值为end迭代器,也是一个不能访问的位置。
- emplace、emplace_back插入(更高效)
vector<B> v;
B b(1, 2);
v.insert(v.begin(), b);//12 插入
v.emplace(v.begin(), 3, 4);//12 34 构造 + 插入
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 空间的结束位置