容器、结构与分类
容器 :所有的容器都维护着两个迭代器,分别指向头和尾
STL容器是将运用最广的数据结构实现出来
根据数据在容器中的排列特性,将这些数据结构分为序列式和关联式两种
序列式容器(advlsqp)array\deque\vector\list\queue\priority-queue
Array
连续空间,其迭代器就是指针。
- Vector
Vector<int> s(n,value);
vector的数据安排与操作方式与array很相似,维护的是一个连续线性空间。区别是空间的运用灵活性。
array是静态空间,一旦配置了大小就不能改变
vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素
vector 原始对象本身大小为12(32位)对应3根指针。
在VS中可用sizeof(vector<T>)来输出查看。
vector的数据结构:线性连续空间
它以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,注意finish指向的是最后一个元素后面那个元素。并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
vector实际配置的大小比会比客户端需求量更大一些,以备将来可能的扩充。即容量的观念
即一个vector的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次再有新增元素,整个vector就得容量扩张(重新配置所需空间、所有元素移动到新空间、释放原空间),工程浩大。
注意:对vector增加新元素时,如果超过了当时的容量,则容量会扩充至两倍。
vector的构造与内存管理:以constructor、push_back为例
构造函数之一:vector(size_type n,const T&value){fill_initialize(n,value);}
内存管理:当我们以push_back()将新元素插入于vector尾端时,该函数首先检查是否还有备用空间,如果有就直接在备用空间上构造元素,并调整迭代器finish,使vector增大。如果没有空间则扩充空间(重新配置所需空间、所有元素移动到新空间、释放原空间)。
注意:所谓动态增加空间并不是在原空间接续新空间(因为无法保证原空间之后还有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间。
因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了
vector的迭代器:
因为vector维护的是一个连续线性空间,所以普通指针就可以作为vector的迭代器,支持operator*、operator->、operator++、operator--等操作。vector支持随机存取.
成员函数:
vector(矢量)的常用成员函数:
begin()、end()、size()、capacity()、operator[]、front()、back()、push_back()、pop_back()、erase()、clear(){erase(begin(),end());}
vector的部分元素操作:pop_back、erase、clear、insert P123
//将尾端元素拿掉,并调整大小
void pop_back(){
--finish;//将尾端标记往前移一格,表示将放弃尾端元素
destroy(finish);
}
//清除[first,last)中的所有元素
iterator erase(iterator first,iterator last)
//清除某个位置上的元素
iterator erase(iterator position)
//清除vector中的所有元素,与erase的第一种定义相同
void clear(){erase(begin(),end());
//在position 前方插入n个元素,元素初值为x
void vector<T,Alloc>::insert(iterator position,size_type n,const T&x)