STL中的容器

常用的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)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值