【C++ STL 容器】map 和 set 详解

1.什么是关联式容器呢?

🍎① vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。

🍎② 那什么是关联式容器?它与序列式容器有什么区别?
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是 <key, value>结构的键值对 ,在数据检索时比序列式容器 效率更高。



2.键值对的定义

🐧① 用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。

🐧② 比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该单词,在词典中就可以找到与其对应的中文含义。(即:通过我们建立的对应关系快速的检索🔍数据)

SGI-STL中关于键值对的定义如下:

template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;

T1 first;
T2 second;

pair(): first(T1()), second(T2())
{}

pair(const T1& a, const T2& b): first(a), second(b)
{}
};


3. set 详解

3.1 set 的基本介绍
  1. set是按照一定次序存储元素的容器(默认从小到大);
  2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。
    set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
  5. set在底层是用二叉搜索树(红黑树)实现的。
  • 注意:❗
    🐧1. 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放 value,但在底层实际存放的是由<value, value>构成的键值对。

    🐧2. set 中插入元素时,只需要插入value即可,不需要构造键值对。

    🐧3. set 中的元素不可以重复(因此可以使用set进行去重)。

    🐧4. 使用set的迭代器遍历set中的元素,可以得到有序序列

    🐧5. set中的元素默认按照小于来比较

    🐧6. set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n (即查找高度次)

    🐧7. set中的元素为什么不允许修改呢 ?(因为 set 里面存的数据,其实就是 key,键肯定不允许修改的,必须保持唯一性)

    🐧8. set中的底层使用二叉搜索树(红黑树)来实现


3.2 set 的使用细节
  • 🍎①set 的模板参数列表
    在这里插入图片描述

  • 🍎②set 的构造
    在这里插入图片描述

在这里插入图片描述


  • 🍎②set 的迭代器
    在这里插入图片描述

  • 🍎②set 的容量

在这里插入图片描述


  • 🍎②set 的修改操作
    在这里插入图片描述


4. map 详解

  • 🍎①map 的模板参数说明

在这里插入图片描述


  • 🍎②map 的构造

在这里插入图片描述


  • 🍎③map 的迭代器

在这里插入图片描述


  • 🍎③map 的迭代器
  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

未来可期LJ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值