常用的STL容器有 string vector deque stack queue set/multiset map/multiset list
【要知道容器中是可以嵌套容器的】
1.string容器
string容器是对c语言中char*的封装。string类中封装了很多常用的成员方法,比如copy、insert、find等。而且使用string时无需我们自己申请或释放内存,也不用考虑内存溢出等问题。
要知道char*是一个指针,string是一个类。如果要将char* 数据转换为string类型的数据,可以借助于string类中提供的方法c_str()。
string中存取符[]和at都可以返回第n个字符,但使用[]时要注意,如果越界,程序会直接挂掉;如果使用at的话,如果越界,它会抛出异常。
2.vector容器
vector是动态数组,连续内存空间,随机存取数据效率比较高。
vector是一种单口容器,在队尾插入或删除数据效率高,但在指定的位置插入、删除会导致数据元素的移动,效率低。
vector是如何实现动态增长的?
vector容器在创建时,会申请一块连续的内存空间;当要插入新数据时,且该内存空间早已被使用完毕时,它将申请一块更大的内存空间,然后将原空间内的数据全部copy到新的空间中,随之释放原空间内存,再讲新数据插入到新空间中。
vector中reserve和resize的区别?
容器提供了预留空间的方法reserve,和改变空间大小的方法resize。
reserve在空间内部创建元素对象,所以在没有添加元素之前,不能引用容器内的元素。
resize创建元素对象,调用这个函数后,可以引用容器内的对象。
3.deque容器 【双端队列】
deque容器是双口容器,且也是连续性空间。可以拿它与单口容器vector对比。
deque容器在双端插入或删除数据效率高。
deque容器指定位置插入或删除数据也会导致数据元素的移动,降低效率。但可随机存取,效率高。
deque与vector容器的区别?
他们可以在头端进行数据的插入和删除;vector是一整段连续的内存空间,而deque是没有容量概念的,它是动态的以分段的连续空间组合而成,随时可以增加一段新的空间并链接起来。
4.stack容器 【栈】
stack是一种先进后出的数据结构,只有一个出口。只允许在栈顶新增、删除、获取数据元素。不支持遍历,没有迭代器。
5.queue容器 【堆】
queue是一种先进先出的数据结构,有一个出口,一个进口。出口删除、获取数据元素;进口新增数据元素。不支持遍历,没有迭代器。
6.list容器 【双向链表】
list是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序由链表中指针链接次序实现。链表由一系列节点组成,节点可以在运行时动态生成。每个节点包括数据域和指针域两部分。
链表采用动态村塾分配,不会造成内存浪费和溢出。链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素。链表灵活,但是空间和时间额外耗费较大。
list链表和数组有什么区别?
数组必须固定长度,不能动态增减内存空间,数据元素过多,有溢出风险,数据元素少,则造成内存浪费;list内存空间可动态增减,不会造成内存溢出或浪费。且方便数据元素的插入和删除。
7.set/multiset容器
set、multiset的特性是所有元素都会根据元素的值进行排序。set是以红黑树为底层机制,查找效率非常好。set容器中不允许有重复元素,但multiset允许。
注意:set容器中的元素值不可以被改变。一旦改变,set容器中的排序会被打乱。
8.map/multimap容器
map与set相比,map中有键值和实值,所有元素根据键值自动排序,pair的第一元素为键值,第二元素为实值。map也是以红黑树为底层实现机制。
map中的键值不能被修改,一旦被修改,将破坏map中的排序规则;map中的实值是可以被改变的。
map中不允许有相同的key值存在,但multimap允许。
STL容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝。