14.vector(上)
第一种情况

第二种情况,如果没有扩容。
本来是想让2*=10,可是却让新插入的*=10;这也算迭代器失效。第一种是野指针,第二种是位置意义已经变了。第二种情况下次你怎么知道什么时候扩容, 
整个设置成模版,库里的还是自己的都可以打,反正都支持迭代器和范围for,不然改成std,好多都要改,很麻烦,
这里访问p数据会报错由于数据挪动,p已经不是指向2了,所以
VS强制检查所以报错。Linux就不报错,可以想象成迭代器默认指向的就是那个值不是地址,值变了,迭代器就失效了。
insert 以后就不要访问了,要访问就得更新迭代器。、
erase不涉及扩容,只涉及挪动数据,挪动数据覆盖我能不能访问这,
VS认为p位置还是失效了
先把std去掉测我们自己的,没啥问题,
void test_vector3(){std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);print_container(v);// 删除所有的偶数auto it = v.begin();while (it != v.end()){if (*it % 2 == 0){it = v.erase(it);}else{++it;}}print_container(v);}
这样的话,没删干净,
还会崩溃
第一个先挪动然后++ 就把第二个4跳过了,连续的偶数就不行,第三个挪动覆盖2后,然后++,finish--,删除4 it又会加加,但是erase同时会导致finish--,it不会等于end,然后就断言错误,
insert 或者erase 完了去访问都报错,


看看库里面的:

返回下一个位置,更新一下再访问,不要再随便直接访问,

string也有迭代器失效,string很少用迭代器insert erase ,都用下标。所以没讲。
默认构造构造一个匿名对象然后再去拷贝,编译器优化后就是直接构造,const引用也可以,自定义类型一般都是这样缺省
自定义类型调用它的默认构造,如果T是int,这个T(),为了这种场景(模版)内置类型也有了构造函数的概念了,
0,1,2

void resize(size_t n, T val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish < _start + n){*_finish = val;++_finish;}}}大部分用resize初始化,


加25,3 5就相当于删

库里面的没啥毛病,自己的其实是有问题的,v和v1是指向相同空间的,我们没写构造,给的默认构造,所以我们要把拷贝构造析构写上,这拷贝构造用什么写法现代写法还是什么写法,什么写法好用用什么,
报错说没有构造,构造定义说没写任何构造就会生成构造,写了就不生成,拷贝构造也算构造,构造野生不成了吧, 
这么写就行,写不写初始化列表成员变量会走初始化列表,,内置类型有缺省用缺省,不写不会处理,自定义类型调用默认构造
也可以这么写,强制生成默认构造, 接下来分析一下拷贝构造:
空间不够还要扩容,有消耗
reserve一下给多少都行size caopacity
提前开好空间,pushback没有扩容概念,效率更高了。这里不关注传统写法还是现代,怎么方便怎么来,这也不算传统写法现代写法
这看一下赋值
赋值深拷贝这有一个不二原则:就是现代写法。两个都写一下
void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}void clear(){_finish = _start;}// v1 = v3/*vector<T>& operator=(const vector<T>& v){if (this != &v){clear();reserve(v.size());for (auto& e : v){push_back(e);}}return *this;}*/void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}// v1 = v3//vector& operator=(vector v)vector<T>& operator=(vector<T> v){swap(v);return *this;}reserve里有检查,相等或者小于就不会。
在类里面可以用类名替代类型,类外面不行,这是特殊的规定。,推荐还是<>,之前说了类名不能代表类型不要搞特殊, 

