前言
本文主要介绍C++STL中的vector使用以及模拟实现vector会遇到的一些问题及解决方案。
提示:以下是本篇文章正文内容,下面案例可供参考
一、vector使用
①vector定义
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v1; //等待后续传值
v1.push_back(5);
vector<int> v2={2,3,4,5};//给定数组定义
vector<int> v3=v2;
vector<int> v4(v2);
}
vector的定义方式常见的就是上面的几种。我们可以根据场景需要,定义自己的数组。
②vector的插入与遍历
数组定义之后,最常见的操作就是数组插入和数组的遍历。用的比较多的是前面两种遍历方式。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v1; //等待后续传值
v1.push_back(5);
v1.push_back(4);
v1.push_back(3);
v1.push_back(2);
for(const auto&e: v1){
cout<<e<<" ";
}
cout<<endl;
for(int i=0;i<v1.size();i++){
cout<<v1[i]<<" ";
}
cout<<endl;
vector<int>::iterator it =v1.begin();
for(it=v1.begin();it!=v1.end();++it){
(*it)++;
cout<<*it<<" ";
}
cout<<endl;
}
二、vector模拟实现中的坑
①迭代器失效
vector的insert
和erase
操作可能会导致迭代器失效,对于insert
而言,可能会扩容从而导致迭代器失效,对于erase
而言,尾删或者删除完整个vector的时候,迭代器会失效。
insert
应对方法:记录相对位置距离即可。返回值为第一个插入元素的位置。
iterator insert(iterator positon,const T& val) {
assert(positon <= _finish && positon >= _start);
size_t size = (*this).size();
size_t capacity = (*this).capacity();
size_t pos = positon - _start;
if (size == capacity) {
capacity = capacity == 0 ? 4 : capacity * 2;
T* new_start = new T[capacity];
for (size_t i = 0; i < size; i++) {
new_start[i] = (*this)[i];
}
delete[] _start;
_start = new_start;
_finish = _start + size;
_end_of_storage = _start + capacity;
}
iterator tmp = _finish;
iterator pre = nullptr;
while ((int)(tmp - positon) > 0) {
pre = tmp - 1;
*tmp = *pre;
tmp--;
}
*(positon) = val;
_finish++;
return _start + pos;
}
同样,对于erase
操作而言,也是记录相对位置就行。返回值为删除元素的下一个位置。
iterator erase(iterator position) {
assert(position >= _start && position < _finish);
size_t pos = position - _start;
//if (position == _start) _start+=1; //内存泄露 无法释放动态申请的空间
iterator next = position + 1;
iterator pre = nullptr;
while (next<_finish) {
pre = next - 1;
*pre = *next;
next++;
}
_finish--;
return _start + pos;
}
总结
本文主要讲了讲vector的常用使用方法,以及插入删除的时候迭代器失效的原因和解决方案。希望对大家有所帮助。