目录
引言
vector实质上就是数据结构的顺序表,也可以简单地理解为数组,它在库中的实现与之前我们所学的string有很多相似之处,重复的地方在此不多赘述。
空间配置器
可以看到库里vector的模板参数第一项是实例化的类型,也就是顺序表实例化时里面的元素是int还是double的......vector<int> , vector<double>.......
第二个参数是空间配置器,这个概念相对复杂一点,是一种底层实现机制,在使用层面我们可以暂时不用管。说明一下以防产生误解。
vector<char> 与 string的一些差异
首先说明vector<char>与string肯定是不一样的,就相当于char arr[3] = {'a','b','c'} 和char* arr = "abc" 一样,前者不用 '\0'结尾,是字符数组,但是后者是字符串,需要'\0'结尾。因此两者之间是有差异的,不能代替。
第二个差异在于大小的比较,vector<char>比较大小就是单纯按照数组字符个数,而string是字符串,按照ASCLL码进行比较,不按长度比较。
第三个差异在于接口上,它们之间的接口也有很大区别,功能的不同,实现上的不同等等。比如对于操作符+=的重载,string有+=,可以直接在字符串后面加字符\字符串,而vector<char>则没有这个接口。
其它的不同更多体现在vector 与 string整体的不同上,后面讲接口的时候会顺带提出。
vector容器与string容器的一些差异
上面是vector<char>与string的差异,容器本身还有很多异同之处。
string是早期设计的,与后面容器的实现有时代的隔阂,string的接口庞杂繁复,数量是vector的一倍,其实有很多接口是没有什么意义的或者基本不会使用的,但由于向前兼容的特性这些接口都保留了下来。
在insert、erase这些增删接口上面,string与其他容器(如:vector) 的标识也不同,string是使用下标标识位置的,而vector等容器是用迭代器标识位置的 (insert(v.begin()+4,1) )
接口介绍——reserve
reserve接口主要是扩容,通过改变capacity的大小达成目的。
接口本身很简单易懂,但既然能改变capacity能扩容,那能不能缩容呢?
————一般来说是不会实现缩容的,因为缩容是有代价的,不是想缩就缩的。
缩容实质上是开一块新空间拷贝数据,是以空间换时间的方式。
缩容需要先开新空间,拷贝数据过去,然后释放旧空间,频繁缩容就会反复开空间、释放和拷贝,会有较大代价所以一般不会缩容。
有人会问:为什么不能直接缩容释放不需要的一块空间给操作系统,要开新空间拷贝数据呢?
————这样当然是不行的,和内存管理机制有关。
类似malloc一块空间是不能分两次free还给操作系统的。