STL中的标准vector
vector译作向量 底层为顺序表。(vector与前string的区别并承接)前言STLstring在STL出现之前诞生不属于STL但是功能类似于STL内部的成员 vector就正式属于STL部分。1.reserve以size 10 capacity 20举例当vector中reserve值在sizencapacity时不影响capacity 但是string来讲是不一定影响。2.insertvector中insert仅支持迭代器string中支持迭代器还支持pos下标指定位置插入。无原因3.流插入运算符 流提取运算符 vector中不支持 与 但是string中支持。4.vector中无相关重载无法使用 string中有的重载可使用。vector与string的迭代器失效原理一致在不同的平台下有所不同(1).VS一旦迭代器指向的内容的的地址/内容发生改变就会导致迭代器失效。失效直接报错 如insert、erase、reserve及resize等改变内部的函数操作。(2).g迭代器检测较VS下不严格不会报错但实际上已经失效。 //访问会出现意想不到的情况(3).解决方案为迭代器重新赋值。迭代器的区间明确在C中迭代器表示的区间始终是左闭右开。vector的实现是利用类模板因此我们在模拟实现时将函数定义都该放在头文件中。 //即使很长的函数无法内联也应该放入。注意使用迭代器的构造函数在函数前加以另一类模板以大大提高兼容性。 //像vectorlist v(arr, arrsize);的构造。reserve下可以使用memcpy吗为什么 //浅拷贝 若内部有动态申请内容memcpy会析构。2.vector的底层分布注意_finish - _start size; [0. 4) //为什么呢如果size为0那么_finish - _start不就是1 //错误原因迭代器的左闭右开规则导致_finish - _start 0 1是左闭右闭二维分布基本迭代器templateclass 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; } } }