一、基本概念
STL广义上分为:容器、算法、迭代器
容器和算法通过迭代器进行连接。
STL分为六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器。
STL容器就是将运用广泛的一些数据结构实现出来,常用的数据结构有:数组、链表、树、栈、队列、集合、映射等
容器
容器分为序列式容器和关联式容器。
序列式容器:强调排序,容器内的每个元素都有固定的位置
关联式容器:二叉树结构,个元素之间没有严格的物理顺序关系
例如:1,3,5,4,6
依次放入序列式容器顺序还是1,3,5,4,6
放入关联式容器可能就是:1,2,4,5,6
在放入关联式容器时会自动进行一个排序。
算法
算法有质变算法和非质变算法。
质变算法:运算过程中会更改区间内的元素内容,例如拷贝、删除、替换等。例如数组1,2,3变成了数组1, 4 ,5
非质变算法:运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等。
算法通过迭代器才能访问容器中的元素。
迭代器
迭代器可以提供一种方法,使算法既能够访问某个容器中的元素而又不用暴露容器的内部表示方式。
每个容器都有自己专属的迭代器。
二、string容器
string容器是一个类,内部封装了char*指针,该指针用于管理字符串,string是一个char*类型的容器。
string的构造函数根据参数类型不同有不同的构造方式:默认的无参数构造,用字符串初始化(将c语言中的字符串构造出c++的字符串),拷贝构造,用n个字符组合构造
赋值操作:将n个字符或字符串赋值给当前字符串
拼接操作:实现在字符串末尾拼接字符
重载操作符:拼接char*字符串或字符c
从指定位置开始的n个字符拼接至末尾
查找操作:从指定的位置开始查找字符串出现的位置
string字符存取方式:利用[]方式取字符;利用at方式取字符
三、vector容器
vector的数据安排以及操作方式,与array相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,首先要配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。
vector构造函数:默认构造,拷贝指定区间元素,拷贝构造
赋值操作:将指定区间数据拷贝赋值;可实现重载运算符操作
vector大小操作:size返回容器中元素的个数
empty()判断容器是否为空
resize重新指定容器的长度为,若容器变长,则以指定值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
capacity():计算容器的容量
reserve:容器预留指定元素长度,预留位置不初始化,元素不可访问。
数据存取:at()返回索引指向的数据,如果越界,返回异常。
front和back返回容器中第一个和最后一个元素
收缩vector内存空间:
swap(vec)将vec与本身的元素互换
vector<int>(v).swap(v)匿名对象交换收缩空间,解决vector容器中size很小,capacity很大的情况。vector<int>(v)是匿名对象拷贝构造了v中size大小的内容,swap(v)再与v进行交换,此时新的v的容量就是和size一样大了。匿名对象在调用完成后系统会进行自动回收。
四、deque容器
vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。双向开口是可以在头尾两端分别做元素的插入和删除操作。
deque与vector容器主要的区别是deque允许使用常数项时间对头端进行元素的插入和删除操作。deque没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。因此,deque没有必要提供空间保留(reserve)功能.
deque容器构造函数:默认构造,拷贝指定区间内元素构造
赋值操作:实现重载运算符
在指定位置或区间实现插入与删除操作
返回索引指向的数据实现数据存取操作
对指定区间内元素进行排序操作
五、stack容器
stack是先进后出的数据结构,它只有一个出口,允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。stack不允许有遍历行为。
Stack所有元素的进出都必须符合”先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。Stack不提供遍历功能,也不提供迭代器。
六、queue容器
Queue是先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。queue容器也没有迭代器。
七、list容器
list链表的数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
相较于vector的连续线性空间,list每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用十分精准。
List容器是一个双向链表。采用动态存储分配,不会造成内存浪费和溢出,但是空间和时间额外耗费较大。