《C++ Primer》 第十一章 关联容器
《C++ Primer》 第十一章 关联容器
11.1 使用关联容器

使用map:
//统计每个单词在输入中出现的次数
map<string, size_t> word_count;//string到size_t的空map
string word;
while(cin>>word)++word_count[word];//提取word的计数器并将其加1
for(const auto &w: word_count)cout<<w.first<<"occurs "<<((w.second>1)?"times":"time")<<endl;
使用set:
//统计每个单词在输入中出现的次数
map<string, size_t> word_count;//string到size_t的空map
set<string> exclude = {"The","But","And","Or","An","A","the","but","and","or","an","a"};
string word;
while(cin>>word)//只统计不在exclude中的单词if(exclude.find(word)==exclude.end())++word_count[word];//获取并递增word的计数器
11.2 关联容器概述
关联容器的迭代器都是双向的,且不支持push_front或push_back。
定义关联容器:
//三个元素,authors将姓映射成名
map<string,string> authors = { {"Joyce", "James"},{"Austen", "Jane"},{"Dickens","Charles"}};
初始化multimap或multiset:允许多个元素具有相同的关键字
//定义一个有20个元素的vector,保存0~9的每个整数的两个拷贝
vector<int> ivec;
for(vector<int>::size_type i=0; i!=10; ++i){ivec.push_back(i);ivec.push_back(u);
}
//iset包含来自ivec的不重复的元素;miset包含所有20个元素
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
pair类型:定义在utility中,两个成员分别是first和second。
pair<string,string> anon; //保存两个string
pair<string, size_t> word_count; //保存一个string和一个size_t
pair<string,vector<int>> line; //保存string和vector<int>
//为每个成员提供初始化器
pair<string,string> author{"James", "Joyce"};

创建pair对象的函数:可以对返回值进行列表初始化
pair<string, int> process(vector<string> &v)
{//处理vif(!v.empty())return {v.back(), v.back().size()};//列表初始化elsereturn pair<string, int>();//隐式构造返回值
}
11.3 关联容器操作

由于不能改变一个元素的关键字,因此pair的关键字部分是const的。
关联容器迭代器:
//获得指向word_count中一个元素的迭代器
auto map_it = word_count.begin();
//*map_it是指向一个pair<const string, size_t>对象的引用
cout<<map_it->first;//打印此元素的关键字
cout<<" "<<map_it->second;//打印此元素的值
map_it->first = "new key";//错误:关键字是const的
++map_it->second;//正确:可以通过迭代器改变元素
set的迭代器是const的:可以用一个set迭代器来读取元素的值,但不能修改
set<int> iset = {0,1,2,3,4,5,6,7,8,9};
set<int>::iterator set_it = iset.begin();
if(set_it!=iset.end()){*set_it=42;//错误:set中的关键字是只读的cout<<*set_it<<endl;//正确:可以读关键字
}
遍历关联容器:
//获得一个指向首元素的迭代器
auto map_it = word_count.cbegin();
//比较当前迭代器和尾后迭代器
while(map_it!=word_count.cend()){//解引用迭代器,打印关键字-值对cout<<map_it->first<<" occurs "<<map_it->second << " times "<<endl;++map_it;//递增迭代器,移动到下一元素
}
添加元素:
vector<int> ivec = {2,4,6,8,2,4,6,8};
set<int> set2;
set2.insert(ivec.begin(), ivec.cend());//有4个元素
set2.insert({1,3,5,7,1,3,5,7});//set2现在有8个元素
向map添加元素:对一个map进行insert操作时,必须记住元素类型是pair。
//向word_count插入word的4种方法
word_count.insert({word,1});
word_count.insert(make_pair(word,1));
word_count.insert(pair<string, size_t>(word,1));
word_count.insert(map<string,size_t>::value_type(word,1));

检测insert的返回值:
//统计每个单词在输入中出现次数的一种更繁琐的方法
map<string, size_t> word_count;//从string到size_t的空map
string word;
while(cin>>word){//插入一个元素,关键字等于word,值为1//若word已在word_count中,insert什么也不做auto ret = word_count.insert({word,1});if(!ret.second)//word已在word_count中++ret.first->second;
}
向multiset或multimap添加元素
multimap<string,string> authors;
//插入第一个元素,关键字为Barth,John
authors.insert({"Barth,John", "Sot-Weed Factor"});
//正确:添加第二个元素,关键字也是Barth,John
authors.insert({"Barth,John","Lost in Funhouse"});
删除元素:
//删除一个关键字,返回删除的元素数量
if(word_count.serase(removal_word))cout<<"ok: "<<removal_word<<" removed\n"
elsecout<<"oops: "<<removal_word<<" not found\n";

map的下标操作:由于下标运算符可能插入一个新元素,所以只对非const的map使用下标操作

访问元素:
set<int> iset={0,1,2,3,4,5,6,7,8};
iset.find(1);//返回一个迭代器,指向key==1的元素
iset.find(11);//返回一个迭代器,其值等于iset.end()
iset.count(1);//返回1
iset.count(11);//返回0


对map可以使用find代替下标操作:
if(word_count.find("foolbar") == word_count.end())cout<<"foolbar is not in the map"<<endl;
在multimap或multiset中查找元素
string search_item("Alain de Botton");//要查找的作者
auto entries = authors.count(search_item);//元素的数量
auto iter = authors.find(search_item);//此作者的第一本书
//用一个循环查找此作者的所有著作
while(entries){cout<<iter->second<<endl;++iter;//前进到下一本书--entries;//记录已经打印了多少本书
}
一种不同的,面向迭代器的解决方法:
for(auto beg = authors.lower_bound(search_item),end = authors.upper_bound(search_item);beg!=end;++beg)cout<<beg->second<<endl;
equal_range函数:
//pos保存迭代器对,表示与关键字匹配的元素范围
for(auto pos = authors.equal_range(search_item);pos.first!=pos.second;++pos.first)cout<<pos.first->second<<endl;//打印每个题目
一个单词转换的map
void word_transform(ifstream &map_file, ifstream &input)
{auto trans_map = buildMap(map_file);//保持转换规则string text;//保存输入中的每一行while(getline(input,text)){//读取一行输入istringstream stream(text);//读取每个单词string word;bool firstword = true;//控制是否打印空格while(stream>>word){if(firstword)firstword = false;elsecout<<" ";//在单词间打印一个空格//transform返回它的第一个参数或其转换之后的形式cout<<transform(word,trans_map);//打印输出}cout<<endl;}
}//函数buildMap读入给定文件,建立起转换映射
map<string,string> buildMap(ifstream &map_file)
{map<string,string> trans_map;//保存转换规则string key;//要转换的单词string value;//转换后的内容//读取第一个单词存入key中,行中剩余内容存入valuewhile(map_file>>key&&getline(map_file,value))if(value.size()>1) //检查是否有转换规则trans_map[key]=value.substr(1);//跳过前导空格elsethrow runtime_error("no rule for "+key);return trans_map;
}//生成转换文本
const string & transform(const string &s, const map<string,string> &m)
{auto map_it=m.find(s);//如果单词在转换规则中if(map_it!=m.cend())return map_it->second;//使用替换短语elsereturn s;//否则返回原string
}
11.4 无序容器
使用无序容器:
//统计出现次数,但单词不会按字典序排列
unordered_map<string,size_t> word_count;
string word;
while(cin>>word)++word_count[word];//提取并递增word的计数器
for(const auto &w: word_count)//对map中的每个元素cout<<w.first<<" occurs "<<w.second<<((w.second>1)?"times":"time")<<endl;
管理桶:

概念总结

vector和map的区别:


相关文章:
《C++ Primer》 第十一章 关联容器
《C Primer》 第十一章 关联容器 11.1 使用关联容器 使用map: //统计每个单词在输入中出现的次数 map<string, size_t> word_count;//string到size_t的空map string word; while(cin>>word)word_count[word];//提取word的计数器并将其加1 for(const auto &w:…...
WebRTC标准与框架解读(1)
1、如果让我来设计webrtc框架我在分析源码的时候,都喜欢做这样一件事情:如果让我来设计它,我会怎么做?大家可以紧跟我的思路,分析一下WebRTC为什么如此设计。为了对整个框架有有一个全面的了解,我们首先要做…...
数据结构的一些基础概念
一 基本术语 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据元素:是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处…...
【Python每日一练】总目录(不断更新中...)
Python 2023.03 20230303 1. 两数之和 ★ 2. 组合总和 ★★ 3. 相同的树 ★★ 20230302 1. 字符串统计 2. 合并两个有序链表 3. 下一个排列 20230301 1. 只出现一次的数字 2. 以特殊格式处理连续增加的数字 3. 最短回文串 Python 2023.02 20230228 1. 螺旋矩阵 …...
latex插入图片(自用)
加入宏包:\usepackage{graphicx} 使用 \includegraphics 命令进行插图。 \includegraphics[]{}: 第一参数[]:对图片做一些适当的调整(设定图片的高度和宽度或者按比例缩放) 第二参数{}:图片的名字…...
【微信小程序】-- 网络数据请求(十九)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
K8S 实用工具之一 - 如何合并多个 kubeconfig?
开篇 📜 引言: 磨刀不误砍柴工工欲善其事必先利其器 K8S 集群规模,有的公司倾向于少量大规模 K8S 集群,也有的公司会倾向于大量小规模的 K8S 集群。 如果是第二种情况,是否有一个简单的 kubectl 命令来获取一个 kubec…...
阿里云ECS服务器的6大功能组件
阿里的云服务在国内可以说是首屈一指的了,因此他们家的云服务器也是最受欢迎的。那么,你知道阿里云服务器ECS有哪些功能组件吗?不清楚不要紧,下面服务器吧小编带大家来看看。 在了解之前我们来看一张阿里云服务器ECS的产品组件架…...
外贸建站多少钱?不同预算对应的建站方案!
外贸建站多少钱? 答案是:3000左右。 作为一个外贸企业的经营者,我们深知一个优质的外贸网站对于企业的重要性。 然而,建立一个优质的外贸网站需要耗费大量的时间和资金,因此我们需要在预算有限的情况下,…...
Vue3中hook的使用及使用中遇到的坑
目录前言一,什么是hook二, hook函数的使用2.1 铺垫2.2 hook函数的写法2.3 使用写好的hook函数后记前言 在学习Es6的时候,我们开始使用类与对象,开始模块化管理;在Vue中我们可以使用mixin进行模块化管理;Vu…...
数据库-差集交集并集
数据库-差集交集并集[toc]图示一、并集运算(UNION)并集:两个集合的并集是一个包含集合A和B中所有元素的集合。在T-SQL中,UNION集合运算可以将两个输入查询的结果组合成一个结果集。需要注意的是:如果一个行在任何一个输…...
spark性能调优(四):网络
网络 一、数据读写二、数据处理三、数据传输在平衡不同硬件资源的时候,相比于CPU、内存、磁盘,网络开销处理延迟最高 一、数据读写 对于大多数应用来说,第一步都是从分布式系统中读取数据,不论什么文件格式,也不管哪种文件存储系统,访问数据源是否会引入网络开销,取决于任务与…...
高性能 WPF 图表控件LightningChart.NET:支持从 Web 服务器获取数据 | 附最新版试用下载
LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源,实时监控数据流。同时,LightningChart使用突破性创新技术,以实时优化为前提,大大提升了实时渲染的效率和效果&…...
文科女生月入14k背后:转行IT软件测试不是谁都学得来!
转行软件测试背后,或许每个人都有自己的无奈。就拿今天要和大家分享的这位小姐姐来说吧,如果不是万不得已,又怎么会狠下心来转行到IT互联网? 应届生逃避就业,考研失败 和大多数人一样,小姐姐的大学生活过得…...
GB28181监控视频统一汇聚平台LiveGBS将海康大华华为宇视等厂家监控设备统一接入后如何生成固定播放链接或者固定的流地址可以直接无插件播放或者拉取
目前汇聚各种厂家监控设备的视频汇聚平台,基本都是通过GB28181标准协议实现的。下面介绍下LiveGBS Web无插件直播的GB28181视频平台将各厂家(包括海康、大华、华为、宇视、天地伟业等)监控汇聚到同一个服务器上后,如何或者直播链接…...
认识BUG
如何描述 bug一个合格的 bug 描述应该包括以下几个部分:发现问题的版本开发人员需要知道出现问题的版本,才能够获取对应版本的代码来重现故障,并且版本的标识也有利于统计和分析每个版本的质量。问题出现的环境环境分为硬件环境和软件环境&am…...
C++string类型内置的搜索函数
string的搜索操作 string类型一共提供了6种不同的搜索函数,每个函数都有4个重载版本。如果搜索成功,每个搜索操作都会返回一个 string::size_type类型的值,表示匹配发生位置的下标。 如果搜索失败,则会返回一个名位string::npos…...
Disruptor 消费线程丢失、写入无限阻塞问题
使用jstack打印后,发现 1)写入disruptor线程卡死在 java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:338) at com.lmax.…...
【禅道测试环境搭建及安装】Linux上的禅道安装教程,从环境搭建开始
目录 一、操作环境 二、安装VMware 三、安装FinalShell 四、在VMware里安装CentOS 1.前置:CentOS的下载 2.CentOS的安装 3.查看网络 五、用宿主机连接远程的虚拟机 六、禅道包的下载与CentOS配置的修改 七、上传项目包并安装禅道 一、操作环境 Windows 10…...
spring-boot rabbitmq整合
文章请参考:Springboot 整合RabbitMq ,用心看完这一篇就够了 mven依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></depende…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...
