【C++】map和set
目录
一、关联式容器
二、键值对
三、set
🍔set的介绍
🍟set的模板参数列表
🌮set的构造编辑
🥪set的迭代器
编辑
🥙set的容量
🥗set的修改操作
🌭 set的使用
四、map
🍔map的介绍
🍟map的模板参数列表
🌮map的构造
🥪map的迭代器
🥙map的容量和元素访问
编辑
🥗map中的修改操作
🌭 map的使用
五、multiset和multimap
🍔multiset
🍟multimap
六、结语
一、关联式容器
前面我们已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身
❓那什么是关联式容器?它与序列式容器有什么区别?
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。
二、键值对
🌟用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
👉比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该英文单词,在词典中就可以找到与其对应的中文含义
关于键值对的定义:
template <class T1, class T2>struct pair {typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair(): first(T1()), second(T2()){}pair(const T1& a, const T2& b): first(a), second(b){}};
三、set
🍔set的介绍
set官方文档介绍
👉帮大家搬过来了:
🍟set的模板参数列表
🔥注意:
1️⃣T:set中存放元素的类型,可以看作只存value,但实际在底层存储的是<value,value>的键值对
2️⃣Compare:set元素默认按照小于来比较
3️⃣Alloc:set中元素空间的管理方式
🌮set的构造
🥪set的迭代器
🥙set的容量
🥗set的修改操作
🌭 set的使用
四、map
🍔map的介绍
map官方文档介绍
👉帮大家搬过来了
🍟map的模板参数列表
🔥注意:
1️⃣Key:键值对中key的类型
2️⃣T:键值对中value的类型
3️⃣Compare:比较器的类型,map中的元素是按key来比较的,缺省情况下按照小于来比较
4️⃣Alloc:通过空间配置器来申请底层空间
🌮map的构造
🥪map的迭代器
🥙map的容量和元素访问
🔥注意:
operator[]: 在元素访问时,如果该key不存在,operator[]会用默认value和key构造键值对然后插入
at():如果key不存在,直接抛异常
🥗map中的修改操作
🌭 map的使用
void TestMap() {map<string, string> m;// 向map中插入元素的方式:// 1.将键值对<"peach","桃子">插入map中,用pair直接来构造键值对m.insert(std::pair<string, string>("peach", "桃子"));// 2.将键值对<"peach","桃子">插入map中,用make_pair函数来构造键值对m.insert(make_pair("banan", "香蕉"));// 3.借用operator[]向map中插入元素,将<"apple", "">插入map中,插入成功,返回value的引用,将“苹果”赋值给该引用结果m["apple"] = "苹果";cout << m.size() << endl;//结果为3// 用迭代器去遍历map中的元素,可以得到一个按照key排序的序列for (auto& e : m)cout << e.first << "--->" << e.second << endl;cout << endl;// map中的键值对key一定是唯一的,如果key存在将插入失败auto ret = m.insert(make_pair("peach", "桃色"));if (ret.second)cout << "<peach, 桃色>不在map中, 已经插入" << endl;elsecout << "键值为peach的元素已经存在:" << ret.first->first << "--->"<< ret.first->second << " 插入失败" << endl;// 删除key为"apple"的元素m.erase("apple");if (1 == m.count("apple"))cout << "apple还在" << endl;elsecout << "apple被吃了" << endl; }
五、multiset和multimap
🍔multiset
🌟multiset相对与set就是允许元素可以重复
🔥注意:
1️⃣multiset 在底层存储的也是<value,value>的键值对
2️⃣使用迭代器对multiset中的元素进行遍历,可以得到有序的序列
3️⃣在multiset中元素不可以修改
🍟multimap
🌟multimap相对与map就是允许key可以重复
🔥注意:
1️⃣multimap中的key是可以重复的
2️⃣multimap中没有重载operator[]操作
3️⃣使用时与map包含的头文件相同
六、结语
🫡你的点赞和关注是作者前进的动力!
🌞最后,作者主页有许多有趣的知识,欢迎大家关注作者,作者会持续更新有意思的代码,在有趣的玩意儿中成长!