STL中的标准vector
2026/4/29 20:48:33 网站建设 项目流程

vector译作:向量 底层为顺序表。

(vector与前string的区别并承接)前言:

STL:string在STL出现之前诞生不属于STL但是功能类似于STL内部的成员 vector就正式属于STL部分。

1.reserve

以size = 10 capacity = 20举例:

当vector中reserve值在size<n<capacity时不影响capacity 但是string来讲是"不一定影响"。

2.insert

vector中insert支持迭代器string中支持迭代器还支持pos下标指定位置插入。无原因

3.流插入运算符<< 流提取运算符 >>

vector中不支持<< 与 >> 但是string中支持。

4.+=

vector中+=无相关重载无法使用 string中有+的重载可使用+=。


vector与string的迭代器失效原理一致:

在不同的平台下有所不同:

(1).VS

一旦迭代器指向的内容的的地址/内容发生改变就会导致迭代器失效。失效直接报错 如:insert、erase、reserve及resize等改变内部的函数操作。

(2).g++

迭代器检测较VS下不严格不会报错但实际上已经失效。 //访问会出现意想不到的情况

(3).解决方案:为迭代器重新赋值

迭代器的区间明确:在C++中迭代器表示的区间始终是左闭右开。


vector的实现是利用类模板

因此我们在模拟实现时将函数定义都该放在头文件中。 //即使很长的函数无法内联也应该放入。

注意:使用迭代器的构造函数在函数前加以另一类模板以大大提高兼容性。 //像vector<list> v(arr, arr+size);的构造。

reserve下可以使用memcpy吗?为什么? //浅拷贝 若内部有动态申请内容memcpy会析构。

2.vector的底层分布

注意:_finish - _start == size; [0. 4) //为什么呢?如果size为0那么_finish - _start不就是1? //错误原因:"迭代器的左闭右开"规则导致_finish - _start == 0!! "1"是左闭右闭!!

二维分布:

基本迭代器:

template<class T> class vector { typedef T* iterator; typedef const T* const_iterator; iterator begin() { return _start; } const iterator begin() const { return _start; } const_iterator cbegin() const { return _start; } const_iterator cbegin() { return _start; } };

复习明确

在写resize时要格外注意什么?

练习:resize的重写
iterator的重写

void resize(size_t n, const T& i = T()) { if (n < size()) { _finish = _start + n; } else { if (n < capacity()) { _finish = _start + n; while (it != _finish) { *it = i; it++;//err忘记++ } return; } reserve(n); iterator it = _finish; _finish = _start + n; while (it != _finish) { *it = i; it++; } } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询