【Black_Panda】STL-map和set
map(映射)
- 是更强大的数组。
- 之所以说它强大,有两点原因:
- 第一, 可以当作数组使用,但下标不仅局限于数字。
- 第二, 的内部元素是的。
1.定义
- 又被称为映射,是从 到 的映射,给定 就能确定 。
- 实际上数组也可以看作是从 到 的映射,其中 是整数下标, 是数组中存储的值
- 要定义一个 ,就要指明 和 的数据类型,定义格式如下:
map<key_t,value_t>名字;
- 例如:
map<string,double>sd;
2.map的使用
- 可以像数组一样进行调用、赋值。
#include <bits/stdc++.h>
using namespace std;
map<string,double>f;
int main(){
f["nihao"]=3.1415926;
cout<<f["nihao"]<<endl;
f["byebye"]=666.789;
cout<<f["byebye"]<<endl;
}
3.迭代器
- 它是用来遍历的,在 的容器中如
vector、map、set
中我们经常要用迭代器去遍历其中的元素,尤其是在 和 中。 - 定义:
map<key_t,value_t>::iterator 迭代器名;
- 首先定义一个
map<string,double>
的迭代器- 例如:
map<string,double>::iterator it;
- 例如:
4.map中的元素——pair
- 在 中,存储的元素有 和 ,对应的是 中的 类型。
- 类型可以单独定义。
pair<key_t,value_t>变量名;
- 它可以理解为含有两个变量 和 的结构体。
-
pair<key_t,value_t>(key,value)
#include <bits/stdc++.h>
using namespace std;
pair<int,int>p;
int main(){
p=pair<int,int>(1,1);
cout<<p.first<<" "<<p.second;
return 0;
}
5.迭代器遍历
- 迭代器像指针一样,可以用
->
符号取出元素。 - 迭代器是 的指针,对应有两个元素。
it->first
是 ,it->second
是 。f.begin()
是 开头对应的迭代器,f.end()
是 结尾位置对应的迭代器(但结尾是没有元素的)。
#include <bits/stdc++.h>
using namespace std;
map<string,double>f;
map<string,double>::iterator it;
int main(){
f["nihao"]=3.1415926;
cout<<f["nihao"]<<endl;
f["byebye"]=666.789;
cout<<f["byebye"]<<endl;
for(it=f.begin();it!=f.end();it++)
cout<<(it->first)<<" "<<(it->second);
}
- 在 中,所有元素是 的。
- 我们用迭代器进行遍历时,遍历到的元素的 也是从小到大的。
6.查找map中的元素
- 使用下列方法查找 中是否有 对应的 。
.find(key);
- 返回值:如果存在,返回元素对应的迭代器,否则返回
.end()
。 - 判断一个键是否存在的方法如下:
if(f.find("byebye") != f.end()){
//存在
}
else{
//不存在
}
- 在不确定 中存在 对应的 时,必须使用 先查找,否则如果直接使用下标索引,会导致运行时错误!(和数组下标越界类似)
set
- ,顾名思义,是一个集合,
- 在 C++ 中, 是一个,其内的元素是按的顺序排好序的。
1.定义
-
在定义一个 时,要指明这个集合中的元素的数据类型。
-
定义格式为:
set<数据类型>名字;
-
例如,如果我们维护一个整数的有序序列,名为 :
set<int> S;
-
集合必须是不
2.元素的插入
将一个数据插入到集合中,需要调用函数 .insert()
#include <bits/stdc++.h>
using namespace std;
set<int>S;
int main(){
S.insert(10);
S.insert(6);
S.insert(9);
}
3.set的遍历
- 与 类似,遍历 中的元素需要用到迭代器。
- 每个迭代器指向 中的一个元素,用
*
可以取出对应的数据。
#include <bits/stdc++.h>
using namespace std;
set<int>S;
set<int>::iterator it;
int main(){
S.insert(10);
S.insert(6);
S.insert(9);
for(it=S.begin();it!=S.end();it++)
cout<<*it<<endl;
}
4.multiset
- 当我们需要统计元素时,我们可以使用”另一个版本“:
multiset
- 定义格式为:
multiset<数据类型>名字;
- 例如,如果我们需要维护一个整数的有序可重复集合,名为MS:
multiset<int>MS;
(在其他方面,例如函数和迭代器,multiset
均与set
用法一致)
5.查找set中的元素
- 使用下列方法查找 中是否有某个元素。
.find(值)
- 返回值:如果存在,返回元素对应的迭代器,否则返回
.end()
。 - 判断一个键是否存在:
if(s.find(1000) != s.end()){
//存在
}
else{
//不存在
}
- 在 中,由于元素不可重复,一旦找到,个数一定为 。
6.查找multiset中的元素
- 因为 是可重集合,怎么才能确定等于 的元素有多少个呢
- 使用下面的方法统计等于 的元素的个数:
.count(key)
map和set小结
- 是键值对,和数组一样,有键值对映射时使用。
- 是不可重集合,可以自动去重。
- 如果想要有重复元素,可换用 。
- 和 都是保持有序的,都可以用迭代器遍历。
本文来自博客园,作者:Black--Panda,转载请注明原文链接:https://www.cnblogs.com/liu-black/p/stl-map_set.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现