网站建设费钱吗,wordpress怎么增加按钮,前端做项目的网站,湛江app开发公司文章目录 模拟实现vector基本成员变量vector的构造与析构vector迭代器vector容量vector元素访问vector修改操作 vector迭代器失效问题什么是迭代器失效1.插入元素导致迭代器失效2.删除元素导致迭代器失效3.重新分配空间导致迭代器失效 如何解决迭代器失效问题 模拟实现
vector… 文章目录 模拟实现vector基本成员变量vector的构造与析构vector迭代器vector容量vector元素访问vector修改操作 vector迭代器失效问题什么是迭代器失效1.插入元素导致迭代器失效2.删除元素导致迭代器失效3.重新分配空间导致迭代器失效 如何解决迭代器失效问题 模拟实现
vector基本成员变量 namespace sg
{templateclass Tclass vector{
public:typedef T* iterator;typedef const T* const_iterator;
private:iterator _start nullptr;iterator _finish nullptr;iterator _end_of_storage nullptr;}
};这里我把成员改成与迭代器相关更方便我们接下来的使用
vector的构造与析构
//构造函数
vector(const vectorT v)
{reserve(v.size()); // 开辟一个空间for (auto e : v){push_back(e);}
}
//析构函数
~vector()
{if (_start) // 如果_start不为空就析构{delete[] _start;_start _finish _end_of_storage nullptr;}
}vector迭代器
iterator begin()
{return _start;
}
iterator end()
{return _finish;
}
const_iterator begin() const
{return _start;
}
const_iterator end() const
{return _finish;
}vector容量
bool empty()
{return _start _finish;
}
void reserve(size_t n)
{size_t old_size size();T* tmp new T[n];memcpy(tmp, _start, size() * sizeof(T));delete[] _start;_start tmp;_finish tmp old_size;_end_of_storage _start n;
}
size_t size()
{return _finish - _start;
}size_t capacity()
{return _end_of_storage - _start;
}void resize(size_t n, T val T())
{if (n size()){_finish _start n;}else{reserve(n);while (_finish _start n){*_finish val;_finish;}}
}vector元素访问
T operator[](size_t i)
{assert(i size());return _start[i];
}vector修改操作
void push_back(const T x)
{if (_finish _end_of_storage){reserve(capacity() 0 ? 4 : capacity() * 2);}*_finish x;_finish;
}
void pop_back()
{assert(!empty());--_finish;
}
iterator insert(iterator pos, const T x)
{assert(pos _start);assert(pos _finish);//扩容if (_finish _end_of_storage){size_t len pos - _start;reserve(capacity() 0 ? 4 : capacity() * 2);pos _start len;}iterator end _finish - 1;while (end pos){*(end 1) *end;--end;}*pos x;_finish;return pos;
}
void erase(iterator pos)
{assert(pos _start);assert(pos _finish);iterator it pos 1;while (it ! end()){*(it - 1) *it;it;}--_finish;
}vector迭代器失效问题
迭代器失效的本质是因为vector的内存管理机制和对动态数组的封装方式。vector的某些操作会导致其底层数组的重新分配所以原有的迭代器会失效。
什么是迭代器失效 迭代器失效的常见情况 插入元素在vector末尾插入元素除了指向最后一个元素的迭代器以外其他迭代器依旧有效 如果在其他位置插入则指向该插入位置的迭代器和其之后的所有迭代器失效删除元素删除元素后被删除和删除之后的所有迭代器都会失效重新分配当vector的大小超过当前容量时它可能分配需要更大的空间进行存储元素这种重新分配会导致所有迭代器、指针、引用失效 注意vector的迭代器失效也和编译器环境有关有关指报错和运行。在Linux下g对于迭代器失效的检查就没这么严格一般迭代器失效也还能运行不过运行结果会出错。 1.插入元素导致迭代器失效
int main()
{vectorint v1{ 1,2,3,4,5 };auto it v1.begin();v1.insert(v1.begin(), 99); // 在第一个位置插入元素while (it ! v1.end()){cout *it ;it;}cout endl;return 0;
}插入和删除同理这里我已删除为例
2.删除元素导致迭代器失效
int main()
{vectorint v1{ 1,2,3,4,5 };auto it v1.begin();v1.erase(v1.begin()); // 删除第一个元素while (it ! v1.end()){cout *it ;it;}cout endl;return 0;
}3.重新分配空间导致迭代器失效
int main()
{vectorint v1{ 1,2,3,4,5 };auto it v1.begin();v1.resize(20, 10); // 容量不够重新分配空间又叫异地扩容while (it ! v1.end()){cout *it ;it;}cout endl;return 0;
}如何解决迭代器失效问题
string迭代器失效原因和vector异地扩容类似需要注意。 解决办法在使用前重新赋值 int main()
{vectorint v1{ 1,2,3,4,5 };auto it v1.begin();v1.resize(20, 10); // 容量不够重新分配空间又叫异地扩容it v1.begin(); // 使用前重新赋值while (it ! v1.end()){cout *it ;it;}cout endl;return 0;
}