C++关联容器

1. 关联容器概述

1.1 关联容器类型

关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。两个主要的关联容器类型是mapset。map 中的元素是一些关键字—值对,关键字起到索引的作用,值是与关键字相关联的数据。set 中每个元素为一个关键字,set 支持高效的关键字查询操作。
标准库提供8个关联容器:

容器类型含义容器类型含义
map关联数组,保存关键字—值对unordered_map用哈希函数组织的 map
set关键字即值,即只保存关键字的容器unordered_set用哈希函数组织的 set
multimap关键字可重复出现的 mapunordered_multimap哈希组织的 map,关键字可重复出现
multiset关键字可重复出现的 setunordered_multiset哈希组织的 set,关键字可重复出现

类型 map 和 multimap 定义在头文件 map 中,set 和 multiset 定义在头文件 set 中,无序容器则分别定义在相关的头文件 unordered_mapunordered_set 中。

1.2 使用关联容器

虽然大多数人熟悉诸如 vector 和 list 这样的数据结构,但从未使用过关联结构。在学习标准库关联容器类型之前,我们首先来看一个如何使用这类容器的例子。
1.使用map

map <string, size_t> word_count;
string word;
while(cin >> word)++ word_count[word];
for(const auto & w : word_count)cout << w.first << "occurs" << w.second <<((w.second>1) ? "times" : "time") << endl;

2.使用set

map <string,size_t> word_count;
set<string>exclude = {"the","but","and","or"};
string word;
while(cin >> word){// 只统计不在exclude中的单词if(exclude.find(word) == exclude.end())++ word_count[word];
}

2. 关联容器定义

关联容器不支持顺序容器的位置相关操作,例如push_frontpush_back。原因是关联容器中的元素是根据关键字存储的,这些操作对关联容器没有意义。而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。

2.1 定义关联容器

当定义一个map时,必须即指明关键字类型又指明值类型,而定义一个set时,只需要指明关键字类型,因为 set 中没有值。每个关联容器都定义一个默认构造函数,它创建一个指定类型的空容器,我们可以将关联容器初始化为另一个同类型容器的拷贝,或是从一个值范围来初始化关联容器。只要这些值可以转化为容器所需类型就可以。

set<string> exclude = {"the","but","and","or"};
map<string, string>authors = {{"john","jame"},{"aus","jane"},{"dick","chars"}};

1.初始化multimap或multiset
一个 map 或 set 中的关键字必须是唯一的,即一个容器内关键字不会重复。容器multimapmultiset没有此限制,它们都允许多个值对应相同的关键字。如下所示:

vector<int> ivec;
for(vector<int>::size_type i = 0; i != 10; ++i){ivec.push_back(i);ivec.push_back(i);
}
set<int> iset(ivec.cbegin(), ivec.cend());
multiset<int> miset(ivec.cbegin(), ivec.cend());
cout << ivec.size() << endl;    // 打印出20
cout << iset.size() << endl;    // 打印出10
cout << miset.size() << endl;   // 打印出20

2.2 关键字类型的要求

关联容器对于包含的关键字类型有一些限制,对于有序容器 map、set 和 multimap、multiset,关键字类型必须定义元素比较的方法。默认情况下,标准库使用关键字类型的小于运算符来比较两个关键字。在 set 集合中,关键字类型就是元素类型;在 map 中,关键字类型是元素的第一部分的类型。
1.有序容器的关键字类型
可以向一个算法提供我们自定义的比较操作,类似的也可以提供自己定义的操作来替代关键字上的小于运算符。实际定义的操作可能是一个复杂的函数,但无论我们怎么定义比较函数,它必须具备如下性质:
1.两个关键字不能同时小于等于对方;如果 K1 小于等于 K2,那么 k2 绝不能小于等于 k1;
2.如果 k1 小于等于 k2,且 k2 小于等于 k3,那么 k1 必须小于等于 k3;
3.如果存在两个关键字,任何一个都不小于等于另一个,那么我们称这两个关键字是等价的。
2.使用关键字类型的比较函数
一个容器中元素的操作类型也是该容器类型的一部分。为了指定使用自定义的操作,必须在定义关联容器类型时提供此操作的类型。自定义的操作类型在尖括号中紧跟着元素类型给出。

#include <iostream>
#include <set>
// 比较函数,按照元素的绝对值大小进行比较
bool compareAbs(int a, int b) {return std::abs(a) < std::abs(b);
int main() {// 使用函数指针作为比较函数std::set<int, bool(*)(int, int)> mySet(compareAbs);mySet.insert(-5);mySet.insert(3);mySet.insert(-2);mySet.insert(7);// 输出容器中的元素,按照绝对值从小到大排序for (int num : mySet) {std::cout << num << " ";}return 0;
}

2.3 pair类型

pair 是 C++ 标准库中定义的一个模板类,用于存储一对值,即键值对,通常用于关联容器的元素类型。pair 提供了两个公共成员变量 first 和 second,用来存储两个值。使用make_pair 需要添加头文件utility

#include <iostream>
#include <utility>
int main() {// 创建一个 std::pair 对象std::pair<int, double> myPair

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相比其他关系型数据库,亚信安慧AntDB JDBC驱动特性有哪些不同之处

关键字&#xff1a;JDBC&#xff0c;双引擎语法&#xff0c;安全加强&#xff0c;批量更新 使用Java语言进行各类应用程序的快速开发成为目前比较主要且流行的开发方式。JDBC是 Java 语言中用来连接和操作关系型数据库的 API&#xff0c;在业务程序与关系型数据库通信时&#…

一文了解Git(所有命令)附带图片

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 其他…

机器学习算法理论:线性回归

线性回归 回归的理论解释&#xff1a;回归分析是确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型&#xff0c;可分为线性回归分析和非线性回归分析。 如果在回归分析中&#xff0c;只包括一个自变量和一个因变量&#xff0c;…

Kotlin 函数式接口

函数式接口 接口只有一个抽象方法的接口&#xff0c;称为 函数式接口 functional interface&#xff0c;也叫做 Single Abstract Method(SAM) interface。 注&#xff1a;函数式接口&#xff0c;只有一个抽象方法&#xff0c;但可以有多个非抽象方法。 一、Kotlin Kotlin支持…

【Linux】Linux基础之权限

目录 一、Linux中的用户1.1 用户之间的身份切换1.2 指令提权 二、权限管理2.1 文件权限2.2 权限操作2.3 chown和chgrp 三、文件类型四、目录文件的权限操作五、权限掩码六、粘滞位 一、Linux中的用户 Linux中主要有两种用户&#xff1a; root&#xff0c;超级用户非root&…

基于多反应堆的高并发服务器【C/C++/Reactor】(下)重构Channel类

一、C语言 Channel.h #pragma once #include <stdbool.h> // 定义函数指针 typedef int(*handleFunc)(void* arg);// 定义文件描述符的读写事件 enum FDEvent {TimeOut 0x01,ReadEvent 0x02,WriteEvent 0x04 };struct Channel {// 文件描述符int fd;// 事件int even…

Netfilter 是如何工作的(六):连接跟踪信息的入口创建(in)和出口确认(confirm)

Articles (gitee.io) IPtables-朱双印博客 (zsythink.net) 在 Netfilter 是如何工作的(五) 中连接跟踪信息使用的创建-确认机制的 Netfilter在报文进入系统的入口处&#xff0c;将连接跟踪信息记录在报文上&#xff0c;在出口进行confirm.确认后的连接信息 本文以一个本机上送…

【MATLAB】CEEMDAN+FFT+HHT组合算法

代码原理 集成经验模态分解&#xff08;CEEMDAN&#xff09;是一种信号处理方法&#xff0c;旨在将非线性和非平稳信号分解为本质模态函数&#xff08;IMF&#xff09;。这种方法通过对信号进行多轮迭代&#xff0c;结合了噪声干扰的累计退化&#xff0c;从而更好地处理了信号…

关于React你必须知道的3个错误用法。

1. 你知道如何使用“&&”吗? 在React程序中,我经常使用“&&”运算符来决定是否显示内容,如下所示: 我的组长: “你不知道&&运算符的特性吗?当请求还没有成功返回时,会直接渲染“0”。” 我并不信服, 因为我一直都是这样编写代码,从未出过错。为了…

python日志模块,按天自动切换

import logging from logging.handlers import TimedRotatingFileHandlerclass TimedRotatingLogger:def __init__(self, name, log_dir, levellogging.INFO):# 创建一个loggerself.logger logging.getLogger(name)self.logger.setLevel(level)# 创建一个handler&#xff0c;用…

计算机网络技术-2022期末考试解析

【前言】 这是计算机网络技术这门课&#xff0c;感觉和计网还是有不一样的&#xff0c;但也有能做的&#xff0c;把能做的做了。 一、单项选择题&#xff08;每题2分&#xff0c;共20分&#xff09; 1. 用于测试两台计算机连通状况的命令是 。 ( ) A. cmd B. ping C. ipconf…

Java副本的概念

在Java中&#xff0c;"副本"&#xff08;copy&#xff09;一词可以用于描述不同的概念&#xff0c;具体取决于上下文。以下是两个常见的用法&#xff1a; 对象的副本&#xff1a;在Java中&#xff0c;当你创建一个对象并将其赋值给另一个变量时&#xff0c;实际上是创…

配置CentOS系统以支持静态HTTP服务

CentOS是一个流行的Linux发行版&#xff0c;广泛应用于服务器环境。要配置CentOS系统以支持静态HTTP服务&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Web服务器软件&#xff1a;CentOS自带了Apache HTTP服务器软件&#xff0c;您可以使用以下命令安装它&#xff1…

操作系统期末提纲

操作系统期末提纲 文章目录 操作系统期末提纲第一章 计算机系统概述第二章 操作系统概述第三章 进程描述和控制第四章 线程第五章 并发性: 互斥和同步第六章 并发性:死锁和饥饿第七章 内存管理第八章 虚拟内存第九章 单处理器调度第十一章 I/O管理和磁盘调度第十二章 文件管理 …

Go 知多少?

作为一名已接触过其他语言的开发&#xff0c;再去学习一门新语言可比之前轻松不少&#xff0c; 语言之间存在很多相似点&#xff0c;但是新语言也有自己的不同点&#xff0c;通常我会先了解它与其他语言常遇到的不同点有哪些&#xff0c; 使自己先能够上手编写基础程序&#…

pytorch多GPU并行DistributedDataParallel应用和踩坑记录(本节-单机多卡实现)持续补充

一、 前言 说在前面&#xff1a;网上参考链接很多&#xff0c;参考之后可以实现分布式&#xff0c;但是对其原理还是云里雾里&#xff0c;有时间的建议去看一看原理。并且我实现分布式之后还是显示显存不足&#xff0c;不知道为什么。 参考链接&#xff1a;pytorch多GPU并行训…

业务题day01

1-1 请说一下你项目中是如何进行项目管理和发布的 我们项目使用的是Gogs进行代码托管&#xff0c;Jenkins进行项目自动运维发布。 在我们的项目中&#xff0c;我们使用Gogs进行代码托管和版本控制&#xff0c;以确保团队成员可以协同开发和管理代码。 Gogs是一个轻量级的、开…

Java多线程:初识多线程!左手画方,右手画圆

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

DNS 正/反向解析 主从复制 分离解析

一 DNS概念它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网 每一台 DNS 服务器都只负责管理一个有限范围 根域: 全球根服务器节点只有13个,10个在美国&#xff0c;1个荷兰&#xff0c;1个瑞典&#xff0c;1个日本 一级域名&#xff…

20. 完整的蒙特卡洛强化学习算法

文章目录 1. 回顾2. 约定3. MC强化学习环境对象的表示4.MC强化学习算法的表示5. MC方法的进一步分类 1. 回顾 第16篇给出了强化学习算法框架&#xff0c;随后的第17、18篇给出了该框架下如何进行策略评估以估计出Q ( s , a ) (s,a) (s,a)&#xff0c;第19篇给出了该框架下如何…