STL容器综合(string除外)
①vector容器:
类似于数组,但是他是单端数组
与数组的区别:数组是静态空间,vector是动态可扩展的
动态扩展:找一个更大的新内存空间,把原空间的的数据拷贝一份放到新空间,然后释放掉原空间,而非在原空间的后面续接新空间。
它的迭代器支持随机访问。
原理图:
构造函数:
赋值:
容量和大小:
插入与删除:
数据存取:
容器互换(交换两个vector容器里面的数据,可用于收缩容量[不是大小]):
预留空间:
②deque容器:
双端数组,可对头尾进行插入删除操作
它的迭代器支持随机访问。
与vect的区别:
1.vector对于头部的插入效率低,数据量越大效率越低。
2.deque相对于vector,头部插入删除速度比vector快。
3.vector访问元素时的速度比deque快,这和于两者内部实现有关。
原理图:
内部原理:
deque内部有中控器,维护每段缓冲区中的内容,缓冲区存放真实数据,中控器是维护每个缓冲区的地址,使得deque像一片连续的空间。
构造函数:
赋值:
大小:
插入和删除:
数据存取:
排序(采用了sort算法):
③stack容器(也叫栈):
它是一种先进后出的数据结构,只有一个出口。。
只有顶端的元素才能被外界使用,因此栈不允许有遍历(元素个数不改变的情况下调取出来)行为(可以通过一个一个执行出栈来查看栈内元素)!!
但是可以判断栈是否为空,也可以返回元素个数。。
原理图:
各类常用接口:
④queue容器(队列容器):
它是一种先进先出的数据结构,它拥有两个出口。。
此容器只允许在一端新增元素,另一端移除元素,只有队头队尾才能被调用,也不允许存在遍历(元素个数不改变的情况下调取出来)行为(采用出队来查看元素)!!
同样他也能判断队列是否为空,以及返回队列的大小。
原理图(只能队尾进,对头出):
各类常用接口:
⑤list容器(链表):
作用:将数据进行链式存储。。
链表是由一些列的结点组成的。。
一个节点中包含有两个域:分别是存储数据元素的数据源和存储下一个结点地址的指针域。。
在STL中,链表是一个双向循环的链表。。
list有一个很重要的性质:插入操作和删除操作都不会造成原有的lisst迭代器的失效,这在vector是不成立的(vector更换内存的时候就会使原来的迭代器失效[原来的迭代器仍旧指向之前的位置])。。
优:可以对任意位置进行快速插入或删除元素,同时采用动态内存分配,不会造成内存浪费和溢出。
缺:容器遍历的速度没有数组快,占用的内存空间比数组大。
链表原理:
原理图:
由于存储的方式不是连续的内存空间,因此链表的迭代器只支持前移和后移,属于双向迭代器。。
构造函数:
赋值和交换:
大小:
插入与删除:
注意:其中大部分都要用到迭代器,例如insert(xx.begin(),199),其中xx为容器名,199为数值。。
数据存储(不支持中括号或是at进行访问):
反转与排序:
注意:所有不支持随机访问迭代器的容器,都不可以使用标准算法(但是其容器内部会提供一些基础算法),因此此处不能采用标准的sort()算法。。
对于自定义的数据类型在进行排序的时候需要进一步指定排序规则!!
⑥set/multiset容器:
作用:当元素被插入时,会自动进行排序。。
本质:set/multiset容器属于关联型容器,底层是采用二叉树来进行实现的。。
set与multiset的区别:set不允许容器中有重复的元素;multiset运行容器中含有重复的元素。
构造与赋值:
插入数据只有insert方式,没有push_back之类的方式。。
大小和交换:
插入和删除:
查找和统计:
对于set容器来说,只返回0或1。。
set与multiset的区别:
1.set不可以插入重复数据,但是multiset可以
2.set插入数据的同时会返回插入结果,以此来表示插入是否成功(multiset没有)
3.multiset不会检测数据,因此可以插入重复数据
pair对组的使用:
本质:成对出现的数据,利用队组可以返回两个数据。。
第一个值的调用采用xx.first,同理第二个数采用xx.second即可调用
容器排序:
可以利用仿函数来改变排序规则!
set容器的排序默认是从小到大。。
自定义的数据类型都要手动去写仿函数来规定排序规则。
⑦map/multimap容器:
简介:
1.map中所有元素都是pair(对组)
2.pair中的第一个元素为Key(键值),起索引作用,第二个元素为value(实值)
3.与set相似,map中所有元素都会按照键值(key,不是value)自动排序。
本质:map/multimap是关联式容器,底层结构是二叉树。
优:可以通过键值快速找到实值
map/multimap的区别:map不允许有重复的键值元素,multimap可以。
构造和赋值:
大小与交换:
插入和删除:
也可以采用中括号(中括号建议用于查找,而非插入数据)
查找和统计:
容器排序:
可以利用仿函数来改变排序规则!(基本同set)
map容器的排序默认是按key值从小到大。。
自定义的数据类型都要手动去写仿函数来规定排序规则。