map和set

文章目录

    • 1.容器的分类(讲解关联式容器)
    • 2.键值对
    • 3. 树形结构的关联式容器
      • 3.1set(是k模型没有修改的权限)(不可有重复的)
        • 3.1.1set的介绍
        • 3.1.2set的类模板
        • 3.1.3 接口介绍
          • 3.1.3.1 insert
            • 定义
            • 第一个定义:
          • 3.1.3.2 find
          • 3.1.3.3 erase
            • 定义
          • 3.1.3.4 lower_bound和upper_bound
          • 3.1.3.5 equal_range
          • 3.1.3.6 count
      • 3.1 multiset(允许相同数字插入)(可以有重复的)
        • 大部分接口和set一样;但是也有下面几种接口不同;
        • insert(插入)
        • find
          • multiset的equal_range作用:(可以将相同的删除)
      • 3.3map(是kv模型)(不可有重复的)
        • 3.3.定义
        • 3.3.1构造函数
      • 3.3.2insert
        • 类型不同却能构造的原因:
      • 3.3.3迭代器
      • 3.3.4 【】
        • 定义
        • 源码
        • 使用insert函数的原因:
    • 简化版源码
    • 应用
      • 3.4multimap(kv模型)可以实现重复

1.容器的分类(讲解关联式容器)

序列式容器:vector/list/deque/stack/queue(线性结构可以随机插入)
关联式容器:map/set(1.不可以随机插入;元素之间具有关联,2.其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高)

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. 树形结构的关联式容器

根据应用场景的不桶,STL总共实现了两种不同结构的关联式容器:树型结构与哈希结构树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器。

3.1set(是k模型没有修改的权限)(不可有重复的)

** 头文件**:

3.1.1set的介绍

set文档介绍

3.1.2set的类模板

map和set_第1张图片

3.1.3 接口介绍
3.1.3.1 insert

** 功能**
排序+去重;

定义

在这里插入图片描述
这两种函数定义多使用第一个;
第一定义中的bool是判断插入是否成功;

第一个定义:

map和set_第2张图片
这里注意pair对象在类外定义时,要将迭代器的模板加上;
在这里插入图片描述

3.1.3.2 find

在这里插入图片描述

3.1.3.3 erase
定义

map和set_第3张图片
map和set_第4张图片

3.1.3.4 lower_bound和upper_bound

两者都是参数是set中的值返回指针;
前者返回>=val值的位置
后者返回>val值位置
map和set_第5张图片

3.1.3.5 equal_range

map和set_第6张图片

3.1.3.6 count

在这里插入图片描述
这一函数找到就返回1,没找到就返回0;
map和set_第7张图片

3.1 multiset(允许相同数字插入)(可以有重复的)

头文件

大部分接口和set一样;但是也有下面几种接口不同;
insert(插入)

功能:排序;没有了去重的功能;

find

功能:有多个相同值时;返回第一个成员的地址;
map和set_第8张图片

multiset的equal_range作用:(可以将相同的删除)

map和set_第9张图片
map和set_第10张图片
** 但是**最简单删除相同的方法:erase(所选的数)
map和set_第11张图片

3.3map(是kv模型)(不可有重复的)

3.3.定义

在这里插入图片描述

3.3.1构造函数

注意两个模板参数
map和set_第12张图片
示例:
map和set_第13张图片

3.3.2insert

map和set_第14张图片
解释value_type
在这里插入图片描述
insert的实现:
1.使用匿名对象进行拷贝构造 来插入;(由括号内的匿名对象拷贝构造成形参类型)
在这里插入图片描述
2.使用make_pair函数
定义:
map和set_第15张图片
使用:
map和set_第16张图片

类型不同却能构造的原因:

map和set_第17张图片

3.3.3迭代器

map和set_第18张图片
使用范围for时:
由于map是自定义类型;使用深拷贝消耗过大;所以建议使用引用
map和set_第19张图片
注意这里的for循环内的对象是pair且是map类内的

3.3.4 【】

定义

在这里插入图片描述
这里传输k的值【】会查找map中的相同k的元素并返回v的引用;

源码

在这里插入图片描述
这里使用insert函数;而且型参数是k和v的默认构造函数;

使用insert函数的原因:

map和set_第20张图片
insert的返回值是一个pair
成功返回新插入的节点位置和ture
失败返回已经存在的key所在节点位置和false;

简化版源码

map和set_第21张图片

应用

map和set_第22张图片
map和set_第23张图片
set和map的insert的对比;
map和set_第24张图片

3.4multimap(kv模型)可以实现重复

和map相同但是没有【】;
示例:
map和set_第25张图片

你可能感兴趣的:(c++)