STL的其他容器讲解

前言


c++文章连载:
1.C++基础
  1.C++基础
  2.C++新增和有变化的关键字
  3.C++的内存管理
2.面向对象
  1.C++的封装和访问权限
  2.C++继承和多态特性
  3.C++的运算符重载
  4.C++静态类和静态成员
  5.C++的友元函数和友元类
3.模板编程和STL
  1.C++模板编程入门
  2.STL的容器类和迭代器
  3.STL的泛型算法
  4.模板特化与类型萃取
  5.STL的其他容器讲解
  6.智能指针与STL查漏补缺
4.杂项
  1.c++各种流操作
  2.依赖,关联,聚合,组合,继承
  3.一些技巧性的代码设计
  
  


1.STL的三种容器适配器

1.1、什么是容器适配器
(1)回顾:C++三种适配器:函数适配器、容器适配器、迭代器适配器
(2)适配器,adapter,本质是添加一个中间层来转换以适配双方
(3)容器适配器,是用已有容器来二次封装以构建新容器
(4)STL提供三种容器适配器,分别是:stack、queue、priority_queue
(5)stack:栈,先进后出,关心压栈和弹栈操作
(6)queue:队列,FIFO,关心入队和出队操作
(7)priority_queue:优先级队列,内部自排队式进,按优先级出,关心入队和出队操作
1.2、为什么会有容器适配器
(1)顺序式容器是基本容器,偏重于“存储”特性,核心是元素如何在内存中管理
(2)栈和队列是数据结构型容器,偏重于“数据操作”特性,核心是元素如何按需要进去出来
(3)从层次讲:顺序式容器是底层实现,而栈和队列是上层应用
(4)栈和队列底层完全可以由vector、list、array等顺序式容器封装形成,没必要完全从零构建
1.3、总结
(1)容器适配器很多时候用起来和容器完全一样,所以也可以叫容器
(2)容器适配器内部实现和容器不同
(3)容器适配器直接内部没有迭代器,但是间接包含有
(4)容器适配器不能访问内部间接迭代器,而且也没有必要访问
(5)容器适配器怎么实现的可以不必关心,除非你自己需要去定义新的容器适配器

2.容器适配器stack详解

2.1、stack的构造
2.2、stack的操作函数
(1)进栈push
(2)出栈pop
2.3、stack元素查询
(1)栈顶元素读取top
(2)栈内元素个数获取size
(3)栈元素是否空empty
2.4、栈和栈操作
(1)栈元素交换:2个swap
(2)栈元素对比:一众运算符重载

3.queue和priority_queue详解

3.1、queue
(1)FIFO,先进先出
(2)访问元素用front访问队首,用back访问队尾
(3)push时只能push到back的后面,pop时只能从front处pop
3.2、priority_queue
(1)按照规则进时排队,从top出

4.有序关联容器set

4.1、什么是有序关联容器
(1)顺序容器,容器中的元素是按它们在容器中的位置来顺序保存和访问的
(2)顺序容器有array、vector、deque、list、forward_list、string等
(3)关联容器中的元素是按关键字来保存和访问的,关联的意思就是关键字(key)与存储值(value)的关联
(4)主要的关联容器类型是map和set
(5)关联容器支持高效的关键字查找和访问
(6)有序关联容器:容器内元素按顺序排列,一般用树(譬如红黑树)来实现
(7)无序关联容器:容器内元素无顺序排列,一般用哈希表来实现,本质上是一种映射
4.2、set的基本使用
(1)set的基本理解:就是一个用来装Key类型对象的筐子,数学上叫集合
(2)set的构造函数
(3)插入数据可以用insert,插入时内部自动排序
(4)查询set中元素个数用:empty、size,max_size是理论上的最大元素数
(5)清除全部元素用clear
(6)针对清除某个Key用erase,若erase的元素不存在则不报错

5.set的遍历和原地构造

5.1、set的三种遍历方法
(1)使用ranged for
(2)使用迭代器写for循环
(3)使用std::for_each
5.2、set的原地构造
(1)set插入新元素一共有3个方法:insert、emplace、emplace_hint
(2)一般来说,emplace比insert效率更高,参考:http://c.biancheng.net/view/6834.html

6.移动构造和emplace_hint

6.1、移动构造函数
(1)移动构造函数特征:传参是一个右值引用的对象(对比copy构造函数)
(2)右值引用的特征就是&&,lvalue和rvalue相关的内容在第4部分会详解(注意原设计的4和5对调顺序了)
(3)右值引用对应移动语义,对应移动构造函数;而左值引用对应复制语义,对应复制构造函数
(4)移动语义就是直接把右值的临时对象给左值,而不是复制右值给左值重新构造一份
(5)移动构造函数可以避免不必要的深拷贝,这在很多时候可以提升效率
(6)此处案例,如果不提供移动构造函数,则会退而匹配调用拷贝构造函数,但不影响insert和emplace的对比
6.2、emplace_hint
(1)emplace_hint使用得到会比emplace效率更高,主要原因是插入位置会影响内部自排队效率
(2)见cppreference emplace_hint页面案例及分析

7.set的其他方法

7.1、extract和merge
7.2、查找
(1)count
(2)find
(3)contains
(4)equal_range、lower_bound、upper_bound
7.2、观察者
(1)key_comp
(2)value_comp

8_9.有序关联容器map1_2

8.1、map介绍
(1)map和set类似,但是map是(key, value)对,而set只有key
(2)map是映射的意思,此处是key到value的一对一映射。不是地图
(3)map的用法和特征与set非常类似,学会set了再学map就容易多了
8.2、pair
(1)pair即对,也就是(key, value)对,本质是有2个元素的结构体
(2)std::pair是STL的标准pair封装,见cppreference
(3)pair中2个元素类型可以不同,也就是说key和value的类型可以不同
(4)pair中2个元素名字是固定的,key叫first,而value叫second
(5)map中存的元素都是一个一个的pair,访问map的key和value要先从map找到pair,再去first和second
8.3、map的构造函数详解
(1)直接参考cppreference中构造函数页面的sample即可
8.4、其他方法
(1)与set非常类似,详见cppreference
(2)extract是修改map的key值的唯一方法

10.multi_set和multi_map

10.1、multi_版本的差异
(1)set和map中每个容器内所有元素的key都是unique的,不能重复
(2)如果需要容器中同一个key有多个元素,则需要使用multi_版本的set和map
(3)除此区别外,multi_版本和普通版本没有任何差异,所有方法也完全一样
(4)工作中用哪个,取决于实际需求。
10.2、multi_set实战演示
10.3、multi_map实战演示

11.无序关联容器

11.1、无序关联容器和有序关联容器的相同点
(1)也属于关联容器,有set和map两种,set只有key,map有(key, value)对
(2)也有带不带multi_的版本,差异和上节讲的一样
(3)操作方法很多都是重合的,名字和作用也都一样
11.2、无序关联容器和有序关联容器的差异点
(1)有序内部用红黑树实现,无序内部用哈希函数实现
(2)有序插入元素时会内部自动排序,无序插入时不排序,按照哈希规则直接映射存放
11.3、无序关联容器初步使用
(1)unordered_set和unordered_map
(2)构造函数
(3)插入、删除、访问等

12.哈希函数和桶

12.1、什么是哈希函数
(1)哈希表是一种典型数据结构,又被称为是散列表,英文hashmap
(2)STL中的哈希表hashmap就是unordered_map
(3)哈希函数是可以用来实现哈希表的函数,是一类而不是一个
(4)哈希表的本质是k-v结构,也就是给定key可以找到一个位置来对应value
12.2、哈希冲突及其解决
(1)参考:
https://blog.csdn.net/WX_East/article/details/56005664?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control

13.unordered_map中桶相关的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值