☰
STL中的map和set介绍
2026/10/10 2:36:07 网站建设 项目流程

序列式容器和关联式容器

前面我们已经介绍过的STL中的部分容器如:string、vector、list、deque、array等,这些容器统称为序列式容器,因为他们逻辑结构为线性序列,两个位置存储的值之间一般没有紧密的关联关系,比如交换一下,仍是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的

关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是非线性结构,两个位置有紧密的关联关系,交换一下,他的结构就被破坏了。关联式容器中的元素是按关键字(key)来保存和访问的。关联式容器有map/set系列和unordered_map/unordered_set系列

本文所要介绍的map和set的底层是红黑树,红黑树是一棵平衡二叉搜索树,set是key搜索场景,map则是key/value搜索场景

set

偷一下懒,只介绍我觉得需要介绍的

set分为两类,一种是不允许存储重复数据的set,另一种是允许存储重复数据的multiset

下面我们介绍的是set

C++11以后还支持初始化列表初始化,如set的使用中的示例

lower_bound函数与upper_bound函数的功能现在还描述不清楚,我们等到set的使用中的示例再讲其用途

set的使用

multiset的使用

multiset的接口与set的接口一致,我们直接进入使用环节

map

接口类似set,不再重复赘述,只介绍我认为有价值的

operator[]函数有两种情况:1、key不在map中,插入;2、key在map中,查找和修改

文档中如此描述此函数,我们需要对map中的insert函数有一定认识(重点是其参数,返回值)

可以看出调用的是insert函数的第一个重载版本,返回类型是pair<iterator,bool>,我们再看一下文档了解一下

下面是我自己的翻译(仅供参考):

单返回元素(1)返回的pair的first是一个迭代器,要么指向新插入的元素,要么指向因map内已有相等元素而无法插入的那个元素。pair的second如果新元素被插入则是true,如果相等的key已在map中则插入失败是false

接下来我们就可以探究一下operator[]函数的等效函数个人技巧:从中间括号往两边走

第一层是mapped_type()是匿名对象,第二层make_pair函数构造pair对象,第三、四层调用insert函数,第五层取insert返回对象pair<iterator,bool>的first(迭代器)的解引用,最外层得到此迭代器指向结点的second即value

这个函数set中也有,但我们此处再介绍,缓冲一下。返回树中k的迭代器区间(左闭右开),这个在set和map中和find函数区别不大,主要功能体现在multiset和multimap中,如

map的使用

void test3() { pair<string, string> kv1 = { "east","东" }; pair<string, string> kv2 = { "south","南" }; pair<string, string> kv3 = { "west","西" }; pair<string, string> kv4 = { "north","北" }; map<string, string> m1 = { kv1,kv2,kv3,kv4 }; //先创建好pair对象,再利用初始化列表构造map对象 map<string, string> m2 = { {"east","东"},{ "south","南" }, { "west","西" }, { "north","北" } }; //利用隐式类型转换(转换成pair对象)+初始化列表构造 m2.insert(pair<string, string>("student", "学生")); m2.insert(make_pair("college", "大学")); m2.insert({ "internal","内部的" });//最简洁,隐式类型转换(成pair对象) map<string, string>::iterator i = m2.begin(); while (i != m2.end()) { //key不可以修改,value可以 //i->first += "x"; i->second += "x"; //cout << *i << " "; //编译器报错,mao没有重载operaor<<,因为它结点存储有两个数据key/value cout << i->first << ":" << i->second << " "; i++; } cout << endl; for (auto& e : m2) { cout << e.first << ":" << e.second << " "; } cout << endl; //结构化绑定 C++14/17语法 auto [k1, v1] = kv1; auto& [k2, v2] = kv2; k2 += 'k'; v2 += 'v'; for (auto& [k, v] : m2) { cout << k << ":" << v << " "; } cout << endl; }

multimap的使用

multimap与map的区别就是不去重,插入时即使已经有相同的key,也可以插入

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询