一.vector 的使用
1.vector的构造函数:
vector()(无参构造)
vector(size_type n, const value_type& val =value_type())(构造n个val)
vector (const vector& x) (拷贝构造)
vector (InputIterator first, InputIterator last) (迭代器初始化构造)
2.vector iterator的使用:
begin与end
获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator rbegin与rend
获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator
注:end所获得为最后一个元素的下一个位置begin与end的区间是左闭合右开放
3.vector空间增长
size:获取数据个数
capacity:获取空间容量大小
empty:判空
resize:改变数据size
reserve:改变capacity
4.vector增删改查
push_back:尾插
pop_back:尾删
find:查找
insert:指定位置插入
erase:指定位置删除
swap:交换两个vector空间
二.vector迭代器失效问题
1.何为迭代器失效
迭代器可以理解为指针,迭代器的失效就是指针的失效。也就是指针指向的位置失效。
就例如以下代码,当it被erase后it这个迭代器就失效了;
int main()
{
int ar[] ={1,2,3,4,0,5,6,7,8,9};
int n = sizeof(ar) / sizeof(int);
vector<int> v(ar, ar+n);
vector<int>::iterator it = v.begin();
while(it != v.end())
{
if(*it != 0)
cout<<*it;
else
v.erase(it);
it++;
}
return 0;
}
2.什么样的情况下会导致迭代器失效
i:所以会引起扩容的操作都会导致迭代器失效,如:resize,reserve,insert,assign,push_back等函数
如果空间扩容,迭代器指向原空间,扩容后,原空间被释放,迭代器就会失效。
ii:对指定位置的删除erase:
erase删除指定位置后会返回删除位置的下一个元素迭代器,而迭代器并未更新,这时编译器就会报错。但理论上,erase后指定位置后的元素会前移,这样迭代器不应该失效,但是vs考虑到如果删除的是最后一个元素,迭代器就到了end(),这是迭代器就到了一个无效的位置,vs为防止这样的情况,编译器就按照报错处理;
3.如何避免迭代器失效
只要在所有可能导致迭代器失效的操作后,对迭代器进行重新赋值更新即可;