C++关联容器
关联容器的定义#
在应用场景下如何选择容器:顺序容器 or 关联容器?
从容器的存储结构分析:关联容器中的元素是按 关键字
来保存和访问的,而顺序容器中的元素按它们在容器中的位置来顺序保存和访问的。
关联容器的分类#
关联容器按关键字有序保存元素:
容器名称 | 头文件 | 备注 |
---|---|---|
map | #include <map> |
关联数组:保存 键值对 |
set | #include <set> |
关键字就是其值,即只保存关键字的容器 |
multimap | #include <map> |
和map的区别:关键字可重复出现 |
mutilset | #include <set> |
和set的区别:关键字可重复出现 |
关联容器按关键字无序保存元素:
容器名称 | 头文件 | 备注 |
---|---|---|
unordered_map | #include <unordered_map> |
用哈希函数组织的map |
unordered_set | #include <unordered_set> |
用哈希函数组织的set |
unordered_multimap | #include <unordered_map> |
和unordered_map的区别:关键字可重复出现 |
unordered_mutilset | #include <unordered_set> |
和unordered_set的区别:关键字可重复出现 |
频繁使用的关联容器:map 和 set。
一个 map
或 set
中的关键字必须是唯一的,即对于一个给定的关键字,只能有一个元素的关键字等于它。
关联容器的操作#
map#
map的元素是pair,故操作对象是pair。
可以修改map中元素的值,但不能修改元素的键。
/*
* @Description:
* @Author:
* @version:
* @Date: 2023-07-07 14:50:34
* @LastEditors:
* @LastEditTime: 2023-10-07 17:12:19
*/
#include <iostream>
#include <map>
#include <string>
using namespace std;
/*
* map容器保存的都是键值对:<key>:<val>,且键的名称在map中不能出现重复,
* 但值的名称没有这个要求。map容器中会自动根据键对所有的键值对进行排序。
*/
void print_map(map<string, string> mp)
{
map<string, string>::iterator it;
for (it = mp.begin(); it != mp.end(); it++)
{
cout << it->first << ": " << it->second << endl;
}
}
int main()
{
map<string, string> book_person = {
{"《三国演义》", "诸葛亮"},
{"《史记》", "司马迁"}
}; // 定义map容器,并列表初始化(c++11)
map<string, string>::iterator it; // 定义map容器的迭代器
// 插入数据(3种不同的插入方式)
book_person.insert(pair<string, string>("《西游记》", "孙悟空"));
book_person.insert(map<string, string>::value_type("《水浒传》", "鲁智深"));
book_person["《红楼梦》"] = "贾宝玉";
// 迭代器遍历map
cout << "迭代器遍历map:" << endl;
print_map(book_person);
// 查找并获取元素
it = book_person.find("《西游记》");
if (it != book_person.end())
cout << "\nkey 《西游记》 find, the value is " << it->second << endl;
else
cout << "\n《西游记》 not find " << endl;
// 删除元素(map中关键字不能重复,若删除成功,删除数量只有1个)
int num = book_person.erase("《史记》");
if (num == 1)
cout << "《史记》删除成功\n" << endl;
print_map(book_person);
return 0;
}
📌 观察下图,键值对的插入map顺序:{"《三国演义》", "诸葛亮"}, {"《史记》", "司马迁"}, {"《西游记》", "孙悟空"}, {"《水浒传》", "鲁智深"}, {"《红楼梦》", "贾宝玉"},但是map打印输出时却不是按照插入顺序打印的
set#
/*
* @Description:
* @Author:
* @version:
* @Date: 2023-07-04 14:23:19
* @LastEditors:
* @LastEditTime: 2023-10-07 17:32:30
*/
#include <iostream>
#include <set>
using namespace std;
/*
* set容器保存的都是键:<key>:,且键的名称在map中不能出现重复,
* set容器中会自动根据键对所有的键进行排序。
*/
void print_set(set<string> st)
{
set<string>::iterator it;
for (it = st.begin(); it != st.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
set<string> person = {
"孙悟空",
"林黛玉",
"宋江"
}; // 定义set,并列表初始化
set<string>::iterator it;
// 插入元素
person.insert("刘玄德");
// 迭代器遍历set
cout << "迭代器遍历set: ";
print_set(person);
// 查找元素
it = person.find("宋江");
if (it != person.end())
cout << "\n宋江 find" << endl;
else
cout << "\n宋江 not find" << endl;
// 删除元素
int num = person.erase("孙悟空");
if (num == 1)
cout << "孙悟空 删除" << endl;
else
cout << "孙悟空不在set中" << endl;
print_set(person);
return 0;
}
作者:caojun97
出处:https://www.cnblogs.com/caojun97/p/17746300.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
2022-10-11 MQTT协议的消息保留标志位:retained