13.vector(下)
模版不能分离到2个文件,如果分离会出现链接错误,
缺省值给上,不写构造都行。当T实例化成vector的时候,传引用,不需要构造了不改变就加const,
finish 没满 接着放 construct的话数据也要从内存池来,内存池在哪啊,直接new也可以,只要是动态开辟的就行,没满直接用就行,:
满了就扩容:
reserve这用size capacity 都一样,finish和endof storage都是相等的,
可以合并
接下来看reserve
写一部分测一部分
插5个可以看扩容


text.cpp里面包vector,h就可以跑了
调试一下,一插入数据就会崩,因为finish是空指针,
size算出来是不对的,一个是新一个是旧

这样就可以,但是不好,顺序一变就不好了。

这也用的原生指针,begin是开始位置,end是结束位置
支持了迭代器就支持了范围for。这是简单的vector。
给一些const 迭代器

v是以const传的,他是const迭代器,const迭代器能不能调用非const成员函数,不能调用,范围for在const情况下也不行,要转换成const 对象,


假设还有个vector存的double
前面print是vector<int>是不是写死了,按理说应该谁都可以打印,改成模版
编译报错了,
类::这样可能取到类型也有可能取到静态成员变量,类模版是没有实例化的,编译器从上往下编译到这第三行vector<T>不知道,不敢去里面取东西,
这种是实例化的,这种不敢取,到底是类型还是静态成员变量,不知道,要等实例化再取,但是又没有实力化,编译器报错了,所以这typename,,声明模版参数可以用typename 也可以class ,但是typename有不同,如果类模版取内嵌的东西,没有实例化的类模版里面取东西,编译器不能区分这里const_iterator是类型还是静态变量,这里加typename,编译器就知道这程序员确认了类型,合乎语法,想成编译器甩锅,编译器只会检查这块没实例化的初步的语法,
用auto不麻烦
如果不是类型是静态成员变量不需要加关键字,静态成员变量不会这么用
直接这么写,


接下来写一个更复杂的插入: pos是个迭代器,有效迭代器不是0,所以没string 那么复杂

还没写扩容:

这是不扩容的插入,测一下扩容的插入

一直挪动,这就是迭代器失效 ,tmp 是指针,出了作用域销毁也无所谓,
扩容之后pos还指向原来的空间,这种情况较迭代器失效,这种类似野指针,
解决: 记录相对位置,pos-start 
vector要去find 怎么办,没find,string有find是因为就要找单个也要找串比较特殊,所以他单独写,库里面提供了find
跟逆置一样,不仅仅是一个容器,针对所有容器,迭代器传给我,就可以帮我搞,模版,C++所有算法传迭代器区间都有个要求,传左闭右开,没找到返回last,
这个支持迭代器的好处,即支持了类似下标的插入,也支持了类似迭代器的插入,


insert以后可以认为pos已经失效了,pos本来是指向2的,插入数据后挪走了,pos不指向2了,这种也是迭代器失效,

p指向旧空间,其实这(*p)属于越界的野指针访问,这没检查出来而已,
形参传给实参,pos虽然修正,形参改变不影响实参,外面还是失效,不能加引用,加了引用
、
这种写法就不支持了,v.begin()+2或者是返回值(begin)返回临时变量具有常性不能给普通引用,这不就是权限放大。
不访问p就可以了
库里面返回pos
可以这么写
