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++; } } }