c++容器详解
C++为我们提供了许多容器可以使用C++中的容器定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。这些容器大体可以分为顺序容器、关联容器和容器适配器也就是我们常用的STLSTLSTL这里只说一下这些容器之间的关系和特点具体的用法在别的博客中会有详细讲解关联容器关联容器特点set快速查找,元素有序,不允许有...
C++为我们提供了许多容器可以使用
C++中的容器定义为:
在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。
这些容器大体可以分为顺序容器、关联容器和容器适配器
也就是我们常用的STLSTLSTL
这里只说一下这些容器之间的关系和特点
具体的用法在别的博客中会有详细讲解
关联容器
| 关联容器 | 特点 |
|---|---|
| set | 快速查找,元素有序,不允许有重复元素 |
| multiset | 快速查找,元素有序允许有重复元素 |
| unordered_set | 快速查找,元素无序,不允许有重复元素 |
| unordered_multiset | 快速查找,元素无序,允许有重复元素 |
| map | 映射,key-value型容器,元素有序,不允许有重复元素 |
| multimap | 映射,key-value型容器,元素有序,允许有重复元素 |
| unordered_map | 映射,key-value型容器,快速查找,元素无序,不允许有重复元素 |
| unordered_multimap | 映射,key-value型容器,快速查找,元素无序,允许有重复元素 |
上面给出的这些关联容器都是非线性的树结构,内部都是用红黑树这种二叉树结构实现的。
set
字面意思集合,其作用也就是一个集合,里面不允许有相同的元素,其内部是通过链表的方式来组织的,每个元素只包含一个关键字。set是保证有序的,每次插入元素之后都会自动按升序排列。
multiset
顾名思义,可重集合,内部实现方式和setsetset相同,它允许内部的元素重复,同一个元素可以出现多次
unordered_set
无序集合,是一个存储唯一元素的关联容器,容器中的元素无特别的秩序关系,该容器允许基于值的快速元素检索,同时也支持正向迭代。其内部实现与setsetset不同,是用哈希表实现的。
unordered_multiset
和上面一样的,只是元素可以重复
顺序容器
| 顺序容器 | 特点 |
|---|---|
| deque | 可以在容器的开头或结尾分别插入或删除元素 |
| vector | 在容器后方插入或删除元素,可通过下标直接访问 |
| list | 可以在任何地方插入或删除 |
deque
双端队列,可以在队列的首尾进行操作,其内部实现更加复杂,支持对所有元素的随机访问,它的随机访问和遍历性能比vectorvectorvector差。它不像vectorvectorvector一样有连续的存储空间,而是多个连续的内存块。应用举例就是spfaspfaspfa的slfslfslf优化。
vector
vectorvectorvector是一种线性顺序结构,它的大小和所用内存是不定的,会在使用中自动分配。vectorvectorvector是一个类模板,像vector<int>vector<int>vector<int>才叫一种数据类型。它的存储空间是连续的。
list
这个基本是用的最少的了,它是一个线性双向链表结构。它的随机访问是要按顺序查找,并不像vectorvectorvector一样直接找到地址。内存空间和dequedequedeque一样不是连续的。
| 容器适配器 | 特点 |
|---|---|
| stack | 不允许随机访问栈元素,先进后出 |
| queue | 不允许随机访问队列元素,先进先出 |
| priority_queue | 不允许随机访问队列元素,优先级高的先出 |
stack
支持先进后出,是一个线性表,插入和删除只在表的一端进行,它不提供元素的任何迭代器操作。由于它的的内部使用的是其他容器,因此它可看做是一种适配器,作用就是将一种容器转换为另一种容器。它的模版需要定义两个模版参数,一个是元素类型,一个是容器类型,元素类型是必要的,容器类型是可选的,默认为dequedequedeque类型。
queue
queue与上面的stack十分相似,支持先进先出
priority_queue
在queuequeuequeue的头文件中还定义了一个十分有用的模板类,它的特点就是队头的元素一定是优先级最高的元素,和进队顺序无关,这使它的应用范围特别广
更多推荐



所有评论(0)