C++ STL容器概览

容器概览

容器分类

  • 顺序容器提供对元素(半开)序列的访问。
    • vector
    • list
    • forward_list
    • deque
  • 关联容器提供基于关键字的关联查询。
    • 有序关联容器:通常用平衡二叉树(红黑树)实现。
      • map
      • multimap
      • set
      • multiset
    • 无序关联容器:采用溢出链表法的哈希函数实现。
      • unordered_map
      • unordered_multimap
      • unordered_set
      • unordered_multiset
        标准库,还提供了一些保存元素的对象类型,但它们并未提供顺序容器或关联容器的全部功能:
  • 容器适配器提供对底层容器的特殊访问。
    • pirority_queue
    • queue
    • stack
  • 拟容器保存元素序列,提供容器的大部分但非全部功能。
    • array
    • 内置数组
    • string
    • valarray
    • bitset

对元素的要求

若想作为一个容器的元素,对象类型必须允许容器拷贝、移动以及交换元素。
关联容器要求其元素能够排序,很多可以应用于容器的算法也有这样的要求。
默认情况下,<运算符被用来定义序。
排序标准必须定义一个严格弱序。
即,一个排序标准必须满足:

  • 反自反性:不小于自身。
  • 反对称性:两个操作对象不能同时小于对方;如果 x 小于 y,那么 y 绝不能小于 x。
  • 传递性:如果 x 小于 y,且 y 小于 z,那么 x 必须小于 z。
  • 相等的传递性:如果 x 等于 y,且 y 等于 z,那么 x 必须等于 z(x == y定义为!(x < y || y < x))。

顺序容器

vector 定义在<vector> 中;list 和 forward_list 定义在<list>中;deque 定义在<deque>中。
顺序容器为元素连续分配内存(vector 和 deque)或将元素组织为链表(list 和 forward_list )。
vector(以及类似的连续存储的元素的数据结构)有三个主要优势:

  • vector 的元素是紧凑存储的。
  • vector 的遍历非常快。
  • vector 支持简单且高效的随机访问。
    当在一个 vector 中插入、删除元素时,其它元素可能会移动。
    一个空 forward_list 只占用一个内存字。
容器功能
vector<T,A>空间连续分配的 T 类型元素序列;默认选择容器
list<T,A>T 类型元素双向列表;当需要插入或删除元素,但不移动已有元素时选择它
forward_list<T,A>T 类型元素单向列表;很短或空序列的理想选择
deque<T,A>T 类型元素双端队列;向量和链表的混合;对大多数应用而言,都比向量和链表其中之一要慢

模板参数 T 是元素类型;
模板参数 A 是一个分配器,容器用它来分配和释放内存;
A 的默认值是std::allocator<T>,此分配器用operator new()operator delete()为元素分配和释放内存。

有序关联容器

map 和 mutlimap 定义在头文件<map>中;set 和 mutliset 定义在头文件<set>中。

容器功能
map<K,V,C,A>从 K 到 V 的有序映射;一个(k,V)对序列
multimap<K,V,C,A>从 K 到 V 的有序映射;允许重复关键字
set<K,C,A>K 的有序集合
multiset<K,C,A>K 的有序集合,允许重复关键字

模板参数 K 为关键字类型,其默认序标准是std::less<K>
模板参数 V 为值类型;
模板参数 C 是比较类型;
模板参数 A 是一个分配器,容器用它来分配和释放内存;
对映射,A 的默认值是std::allocator<std::pair<const K,T>>
对集合,A 的默认值是std::allocator<T>

无序关联容器

无序容器则定义在头文 <unordered_map><unordered_set>中。

容器功能
unordered_map<K,V,H,E,A>从 K 到 V 的无序映射
unordered_set<K,V,H,E,A>从 K 到 V 的无序映射;允许重复关键字
unordered_multimap<K,H,E,A>K 的无序集合
unordered_multiset<K,H,E,A>K 的无序集合,允许重复关键字

模板参数 H 是哈希函数类型,其默认值是std::hash<K>
模板参数 E 是相等性判定函数类型,其默认值是std::equal_to<K>

容器适配器

容器功能
pirority_queue<T,C,Cmp>T 的优先队列
queue<T,C>T 的队列,支持 push() 和 pop() 操作
stack<T,C>T 的栈,支持 push() 和 pop() 操作

模板参数 Cmp 是优先级函数类型,其默认值是std::less<T>
模版参数 C 是一个容器类型;
queue 的默认容器类型是std::dequeue<T>
stack 和 pirority_queue 的默认容器类型是std::vecter<T>

拟容器

容器功能
T[N]固定大小的内置数组;N 个连续存储的类型为 T 的元素;没有 size() 或其它成员函数
array[T,N]固定大小的数组;N 个连续存储的类型为 T 的元素;类似内置数组
basic_string<C,Tr,A>一个连续分配空间的类型为 C 的字符序列,支持文本操作(如连接 + 和 +=)
stringbasic_string<char>
u16stringbasic_string<char16_t>
u32stringbasic_string<char32_t>
wstringbasic_string<wchar_t>
valarray<T>数值向量,支持向量运算,但有一些限制,这些限制是为了鼓励高性能实现;只在做大量向量运算时使用
bitset[N]N 个二进制位的集合,支持集合操作,如 & 和
vector<bool>vector<T>的特例化版本,紧凑保存二进制

对于 basic_string,模板参数 A 是一个分配器,Tr 是字符萃取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往昔的恒纳兰那

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值