【STL八】关联容器

2023-05-16

【STL八】关联容器

  • 一、简介
  • 二、分类
  • 三、生成键值对方法一:map[key] = value
  • 四、生成键值对方法二:pair、make_pair
    • 1、pair
    • 2、make_pair
    • 3、pair、make_pair() 头文件
    • 4、demo

关联式容器,包括 map、multimap、set 以及 multiset 这 4 种容器。
关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保持和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。

一、简介

  • 关联式容器存储的元素,都是一个一个的“键值对”( <key,value> );

如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。

  • 序列式容器中存储的元素默认都是未经过排序的,而使用关联式容器存储的元素,默认会根据各元素的键值的大小做升序排序。
  • 联式容器所具备的这些特性,归咎于 STL 标准库在实现该类型容器时,底层选用了 「红黑树」这种数据结构来组织和存储各个键值对。
  • 关联容器实现能快速查找( O(log n) 复杂度)的数据结构。

红黑树这种数据结构,我也不太懂,后面学习。

关联容器的主要优点是,它能很快找出一个具有某特定 value 的元素,因为它具备对数复杂度(logarithmic complexity),而任何循序列容器的复杂度是线性。因此,使用关联式容器,面对1000个元素,平均而言你将有10次而不是500次比较动作。然而它有一个缺点是,你不能直接改动元素的 value ,因为那会破坏元素的自动排序。

在这里插入图片描述

二、分类

  • C++ STL 标准库提供了 4 种关联式容器,分别为 map、set、multimap、multiset.
  • 你可以将set视为一种特殊的map:元素的value等同于key.。实际产品种所有这些关联式容器通常都由二叉树实现而成。(binary tree)

红黑树是一种特定类型的二叉树

关联式容器名称头文件特点
map<map>使用该容器存储的数据,其各个元素的键必须是唯一的(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less)。
set<set>使用该容器存储的数据,各个元素键和值完全相同,且各个元素的值不能重复(保证了各元素键的唯一性)。该容器会自动根据各个元素的键(其实也就是元素值)的大小进行升序排序(调用 std::less)。
multimap<map>和 map 容器唯一的不同在于,multimap 容器中存储元素的键可以重复。
multiset<set>和 set 容器唯一的不同在于,multiset 容器中存储元素的值可以重复(一旦值重复,则意味着键也是重复的)。

三、生成键值对方法一:map[key] = value

  • demo
#include<iostream>>
#include<map>
#include<string>
using namespace std;
int main()
{
    map<string, string> m;
    m["小b"] = "家在西安";
    m["小c"] = "家在濮阳";
    m["小a"] = "家在北京";

    for (map<string, string>::iterator ite = m.begin(); ite != m.end(); ++ite) {
        //输出各个元素中的键和值
        cout << ite->first << " => " << ite->second << '\n';
    }
    return 0;
}

输出

小a => 家在北京
小b => 家在西安
小c => 家在濮阳

四、生成键值对方法二:pair、make_pair

1、pair

std::pair可将两个value视为一个单元。

  • 考虑到“键值对”并不是普通类型数据,C++ STL 标准库提供了 pair 类模板,其专门用来将 2 个普通元素 first 和 second创建成一个新元素<first, second>
    模板
template<
    class T1,
    class T2
> struct pair;

2、make_pair

make_pair() 构造 std::pair 对象,从参数类型推导目标类型。

  • make_pair() 函数,其功能是生成一个 pair 对象。因此,当我们将 make_pair() 函数的返回值(是一个临时对象)作为参数传递给 pair() 构造函数时,其调用的是移动构造函数,而不是拷贝构造函数
template< class T1, class T2 >
std::pair<T1,T2> make_pair( T1 t, T2 u );
(C++11)
template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );
(C++11)
(C++14)
template< class T1, class T2 >
constexpr std::pair<V1,V2> make_pair( T1&& t, T2&& u );
(C++14)

3、pair、make_pair() 头文件

#include <utility>  

4、demo

#include <iostream>
#include <utility>      // pair
#include <string>       // string
#include<map>
using namespace std;
int main() {
    // 调用构造函数 1,也就是默认构造函数
    pair <string, string> pair1;
    pair1.first = "小b";
    pair1.second = "家在西安";
    // 调用第 2 种构造函数
    pair <string, string> pair2("小c", "家在濮阳");
    // 调用拷贝构造函数
    pair <string, string> pair3(pair2);

    pair <string, string> pair4 = make_pair("小a", "家在北京");

    cout << "输出pair:" << endl;
    cout << "pair1: " << pair1.first << " " << pair1.second << endl;
    cout << "pair2: " << pair2.first << " " << pair2.second << endl;
    cout << "pair3: " << pair3.first << " " << pair3.second << endl;
    cout << "pair4: " << pair4.first << " " << pair4.second << endl<<endl;

    map<string, string> m;
    m.insert(pair1);
    m.insert(pair2);
    m.insert(pair4);
    m.insert(make_pair("小d", "没有家"));

    cout << "输出map:" << endl;
    for (auto ite = m.begin(); ite != m.end(); ite++)
    {
        cout << ite->first << ">" << ite->second << endl;
    }

    return 0;
}
  • 输出

输出pair:
pair1: 小b 家在西安
pair2: 小c 家在濮阳
pair3: 小c 家在濮阳
pair4: 小a 家在北京

输出map:
小a>家在北京
小b>家在西安
小c>家在濮阳
小d>没有家

接下来,我们会分两篇文章分别详细的介绍下这四种关联容器。

参考
1、C++ STL 容器库 中文文档
2、STL教程:C++ STL快速入门
3、https://www.apiref.com/cpp-zh/cpp/header.html
4、https://en.cppreference.com/w/cpp/container

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STL八】关联容器 的相关文章

  • PC200W-简版loggernet软件

    一 xff0e 解压缩PC200W文件夹 xff0c 双击下图图标 xff0c 可以打开PC200W 二 xff0e 创建一个连接 打开软件后 xff0c 会弹出一个关于创建连接的对话框 xff0c 如果没有弹出 xff0c 可以在Netw
  • 示例一:CR300接CS655

    Public PTemp Batt volt Public CS655 3 Alias CS655 1 61 vwc Alias CS655 2 61 ec Alias CS655 3 61 T Units vwc 61 Units ec
  • 日本原装COM 3600F专业型空气负离子检测仪 --CR1000采集

    Public PTemp Batt volt Public instring string As String 36 Public Num spilt 3 As String 3 Alias Num spilt 1 61 ION FM Pu
  • java FlowLayout示例

    java FlowLayout示例 xff1a import java awt FlowLayout import javax swing JLabel import javax swing WindowConstants import j
  • Get 一个显示界面,与数采串口通信

    程序第一步 xff1a 显示 数据来源 xff0c CR1000数据采集器 xff0c 5秒采集并存储上传 第二步 xff1a 存储 TXT文档存储 xff0c 逗号分隔 xff0c 每月创建一个新的文件 xff0c 可以另存为excel文
  • UART通信协议

    UART通信协议 一 UART是什么 xff1f 1 同步串口通信 vs 异步串口通信2 串行通信 二 通信协议三 工作原理四 特点 一 UART是什么 xff1f 通用异步收发传输器 xff08 Universal Asynchronou
  • win10右下角的通知区域

    属性 gt 通知和操作 gt 选择在任务栏上显示哪些图标 gt
  • UART一对多通信的方法

    通常 xff0c uart为单对单通信 xff0c 当用到一对多时可以用RS485 然而有时候我们MCU的uart口只剩一个 xff0c 又要接多个uart的外围芯片 xff0c 这时如果转成RS485需要加多个485收发器 xff0c 成
  • 全网最全的 postman 工具使用教程

    正文如下 xff0c 如果觉得有用欢迎点赞 关注 postman是一款支持http协议的接口调试与测试工具 xff0c 其主要特点就是功能强大 xff0c 使用简单且易用性好 无论是开发人员进行接口调试 xff0c 还是测试人员做接口测试
  • 星际争霸1终于可以在win10上运行了

    win7的时候 xff0c 星际争霸1就不能运行 xff0c 只好装了个虚拟机 xff0c 在虚拟机里玩 刚刚更新到了win10 xff0c 总觉得在虚拟机里玩不是个事 xff0c 就去网上搜索 xff0c 终于发现了办法 在 StarCr
  • windows下编译opencv 3.4.0

    为了方便后期的调试 xff0c 自己动手编译opencv3 4 0 xff0c 这样有需要的时候还可以自己修改修改源代码 通常来说 xff0c 编译32位比较简单 xff0c 直接用cmake生成编译的工程就行了 xff0c 但64位就比较
  • opencv添加的新接口clearVec()的实现

    自己编译的opencv xff0c 之前文章有说添加了这个接口 xff0c 也有上传3 3 0版本添加这个接口之后编译好的库 xff0c 但是没有把实现过程展现出来 xff0c 导致有些朋友问我如何实现的 xff0c 今天把这个实现放出来
  • 苏泊尔电饭煲不工作的维修

    本篇文章与其说是维修 xff0c 倒不如说成是 拆 xff0c 因为维修相对容易 xff0c 但想拆开却很艰难 xff0c 大部分的时间都花在了拆的工作上面 老家伙的样子如下 型号为 xff1a CYSB50FC99 100 xff0c 铭
  • 萨克斯吹不响的解决办法

    刚开始吹萨克斯 xff0c 发现总是吹不响 看各种入门的文章 xff0c 很多都强调口型的重要性 xff0c 各文章说得也都差不多 xff0c 我仔细捉摸 xff0c 不断尝试 xff0c 似乎还是不得要领 特别是安装好之后 xff0c 很
  • vs2010制作安装工程

    这里的安装工程 xff0c 是指制作安装包 xff0c 而不是vs2010的安装包 用向导生成一个安装工程 xff0c 通常会直接打开一个文件编辑窗口 xff1a 这个窗口很容易编辑 xff0c 把所有要安装的文件拖到 应用程序文件夹 上
  • windows下编译ffmpeg源代码

    由于工作原因 xff0c 需要使用ffmpeg在windows下进行代码跟踪 于是 xff0c 上网找相关文章 xff0c 搜索出来有很多 xff0c 经过查看 xff0c 其中的一个英文网站是最好的 xff0c 网址 xff1a http
  • 注册控件失败之一:提示0x80040200错误的处理办法

    今天有客户反馈说控件无法注册 xff0c 晕 xff0c 这问题好容易困扰开发者以及客服人员 xff0c 但是环境千差万别 xff0c 很难做到完全自动化 出现的错误号码有很多 xff0c 但相对的0x80040200这个号码出现的概率较其
  • win10+ubuntu23.04双系统安装

    win10 win10先安装好 xff08 确保主板上各个螺丝稳定 xff0c 至少4对螺丝 43 铜柱 xff0c 否则会各种蓝屏 xff09 如果双系统安装失败了 xff0c 连win10都进不去了 xff0c 用原版ISO刻录的U盘或
  • 冷门指标移中平均线和多空指数的完美结合(一定要看)

    注 xff0c 原贴地址 xff1a http blog sina com cn s blog 7f0a6fa50101hyls html 在此谨以记录防止原帖无法打开为忧 冷门指标移中平均线和多空指数的完美结合 一定要看 xff09 20
  • LINUX下安装QT的惨痛经历

    安装QT的惨痛经历 目标 xff1a 2012 4月下旬 xff0c 计划开始在linux上安装QT和ffmpeg xff0c 准备摸索一下视频客户端的开发 以下是安装过程 由于没有额外的电脑 xff0c 所以使用了虚拟机安装 电脑上刚好有

随机推荐