《c++ primer笔记》第十一章 关联容器
创始人
2025-05-31 13:36:18
0

前言

关联容器和顺序容器的许多操作都很类似,本章主要简单介绍了4种关联容器,包括如何定义、操作关联容器,内部原理也有简单涉及。

文章目录

    • 一、关联容器
      • 1.1定义关联容器
      • 1.2关联容器操作
      • 1.3无序容器

一、关联容器

​ 关联容器支持高效的关键字查找和访问,两个主要的关联容器类型是mapset。标准库提供8个关联容器,它们的不同有三点:1)set或者map;2)关键字是否重复;3)元素保存顺序。

image-20230316190440938

map

map类型也叫关联数组,意思它与数组类似,不同之处在于索引可以不是一个整数。类似顺序容器,关联容器也是模板

set

set是关键字的简单集合,下面是一个mapset简单使用的案例,代码的功能就是从用户输入的单词中,抛弃那些在set中出现的单词。

map word_count;
set exclude = { " The", "But", "OR"};
string word;
while(cin >> word) {if(exclude.find(word) == exclude.end())++word_count[word];
}

1.1定义关联容器

关联容器不支持顺序容器的位置相关操作,因为关联容器中元素是根据关键字存储的。同时也不接受构造函数或插入操作这些接受一个元素值和一个数量值的操作。关联容器的迭代器都是双向的

​ 每个关联容器都定义了一个默认构造函数,它创建一个指定类型的空容器。

map word_count; // 默认初始化
set exclude = { " The", "But", "OR"};
map word_count = { {"1", 1} ,{"2", 2} ,{"3", 3}}; // 列表初始化

初始化mutimap或multiset

​ 一个mapset中的关键字必须是唯一的,对于multimapmultiset没有限制。

vec; // 含有20个数字,0-9 重复一次
set s(vec.begin(), vec.end()); // 10
multiset mset(vec.begin(), vec.end()); // 20

关键字类型的要求

​ 前面提到有些算法比如sort的比较操作我们可以自定义,类似地,我们也可以在有序关联容器上定义比较操作。注意所提供的比较操作在关键字类型上定义一个严格弱序(小于等于)。规则就是不能出现两个一模一样的关键字。下面是一个案例,第一行代码是错误的,因为我们假如MyClass并没有<运算符,当我们有一个自定义的比较函数cmp,我们就可以在定义multiset时加入比较函数的指针类型

mutiset; // 错误
mutiset;

pair类型

pair定义在头文件utilty中,一个pair保存两个数据成员。pair的默认构造函数对数据成员进行值初始化。

pair anon;
pair word_count;
pair> line;

pair的数据成员是public的,分别为firstsecond

image-20230316194815811

创建pair对象的函数

pair process(vector &v) {if(!v.empty())return {v.back(), v.back().size()}; // 列表初始化,早期C++版本只允许显示构造返回值 pair(v.back, v.back.size())elsereturn pair(); // 隐式构造返回值
}

1.2关联容器操作

​ 对于set类型,key_typevalue_type是一样的,set中保存的值就是关键字。在map中,每个元素都是是一个pair对象,包含一个关键字和一个关联的值。由于不能改变一个元素的关键字,因此这些pair的关键字部分是const的。

image-20230316195516720

set::value_type v1; // string
set::key_type v2; // string
map::value_type v3; // pair
map::key_type v4; //string
map::mapped_type v5;  // int

​ 解引用一个关联容器迭代器时,会得到一个类型为容器的value_type的引用。

auto map_it = word_count.begin();
cout << map_it->first; // 指向关键字
map_it->first = "new key"; // 错误,关键字时const

set的迭代器是const

set iset = {0,1,2,4,5,,6,6};
set::iterator set_it = iset.begin();
if(set_it != iset.end()) {*set_it = 42; // 错误,set中的关键字为只读cout << *set_it << endl;
}

关联容器和算法

​ 一般不对关联容器使用泛型算法,因为关键字的类型为const。当然,对于一些只读元素的算法关联容器是适用的,但是这类算法都要搜索序列,而关联容器中的元素不能通过它们的关键字进行查询(没太懂)。

添加元素

insert向容器中添加一个元素或一个范围,即使添加的元素已经存在也不会对容器造成影响。

vector ivec = {2,4,5,6,7,8};
set set2;
set2.insert(ivec.begin(), ivec.end()); //{2,4,5,6,7,8}
set.inster({{2,4,5,6,7,8}}); //{2,4,5,6,7,8}

对一个map进行insert操作时,必须记住元素的类型是pair

word_count.insert({word, 1});
word_count.insert(make_pair(word,1));
word_count.insert(pair(word, 1));
word_count.insert(pair::value_type(word, 1));

image-20230316203559824

检测insert的返回值

​ 对于不包含重复关键字的容器,添加单一元素的insertemplace版本返回一个pairfirst是一个迭代器,指向具有关键字的元素;second是一个bool值,指出元素是否插入成功。

​ 对允许重复关键字的容器,接受单个元素的insert操作返回一个指向新元素的迭代器。

删除元素

​ 关联容器有三个版本的erase。对于不重复的容器,返回值总是0或1;允许重复的容器删除元素的数量可能大于1。

image-20230320104603102

map的下标操作

mapunordered_map容器都提供了下标运算符和一个对应的at函数。set不支持下标,因为set没有与关键字相关联的值。map可以像数组一样使用[]获取关键字对应的值,值得注意的是,如果原map中没有这个关键字,则会将当前关键字存入map,对应的值会进行值初始化

image-20230320110424001

map的下标运算符的返回类型是一个mapped_type对象,解引用一个map迭代器会得到一个value_type对象。

访问元素

image-20230320111013911

1.3无序容器

​ 无序容器在存储组织上为一组桶,每个桶保存零个或多个元素。容器将具有一个特定哈希值的所有元素都保存在相同的桶中,无序容器的性能依赖于哈希函数的质量和桶的数量和大小。

image-20230320122609586

相关内容

热门资讯

AI“重启”TCL? TCL经历了一个缺乏增长的2024财年。 公司年报显示,2024年TCL全年营业收入为1648.23...
福建大哥卖充电桩:年入5.93... 作者丨铅笔道 黄小贵 7月18日,上海挚达科技发展股份有限公司(下称挚达科技)在港交所递交招股书,拟...
靖江农商银行:金融“活水”润泽... 靖江农商银行以金融创新精准滴灌当地特色消费场景,通过打造常态化惠民平台与支持主题消费活动“双轮驱动”...
1.2万亿雅江水电工程开工!工... 7月22日A股市场迎来戏剧性收盘表现。临近尾盘时分,多个板块突然发力上涨,其中工程机械板块表现最为抢...
香港金融管理局对三家银行采取纪... 北京商报讯(记者 孟凡霞 实习记者 周义力)7月22日,香港金融管理局宣布,根据《打击洗钱及恐怖分子...
原创 突... 美国突然变卦了!就在中美贸易谈判进入关键阶段,美国财长贝森特冷不防抛出新要求——打算在协议里硬塞两条...
深圳新晋13家独角兽企业,福田... 7月18日,2025中国(深圳)独角兽企业大会发布《GEI中国独角兽企业研究报告2025》和《深圳市...
汇划1180亿元!“跨境理财通... 7月21日,记者从人民银行广东省分行获悉,“跨境理财通”自2021年启动以来,极大地促进了粤港澳大湾...
秦洪看盘|热门主线波动不改A股... 来源:澎湃新闻 周二A股市场出现了探底回稳的走势。 早盘由于银行股的疲软,主要股指一度翻绿,升势有受...
股票行情快报:美凯龙(6018... 证券之星消息,截至2025年7月22日收盘,美凯龙(601828)报收于3.07元,上涨0.66%,...
原创 煜... 在全球能源格局加速演变、国内“双碳”目标持续深化的大背景下,电力行业正站在变革的前沿。2025年是“...
星环科技拟港交所上市:年亏损额... 近日,科创板上市公司星环科技(688031.SH)发布公告称,为进一步提高公司综合竞争力,更好地利用...
中国启动水电珠峰水利隧道工程!... 2025年7月,中国雅江集团的成立和雅鲁藏布江下游水电工程的开工,标志着世界水电史迎来新的里程碑。 ...
OpenAI CEO:Deep... 【环球网科技综合报道】7月22日消息,据windowscentral报道称,OpenAI 首席执行官...
国家外汇局贾宁:未来外资配置人... 7月22日,国家外汇管理局国际收支司司长贾宁在国新办新闻发布会上表示,未来外资配置人民币资产仍具有较...
并购 | 深度拆解地方国资收购... 一、交易背景 2023年9月20日晚间,上海雅仕投资发展股份有限公司(以下简称“上海雅仕”)公告称...
21日豆二上涨0.19%,最新... 来源:新浪期货 新浪期货 根据交易所数据,截至7月21日收盘主力合约豆二2509,涨跌+0.19%,...
兴证资管国企红利优选混合发起式... AI基金兴证资管国企红利优选混合发起式A(023169)披露2025年二季报,第二季度基金利润112...
专访新辰商业集团联合创始人及C... 在当前商业环境持续变革的背景下,社区商业正逐步成为商业领域的重要发展方向。新辰商业作为这一领域的后起...