题解 CF992A 【Nastya and an Array】
分析题目,其实就是求非0值且不同的数的个数,用的是set,花了5秒多,这……
先看代码:
#include <iostream>
#include <set>
using namespace std;
set <int> st;
int main()
{
int n, x, y = 0;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> x;
if(x != 0)
{
st.insert(x);
}
}
cout << st.size() << endl;
return 0;
}
同样,这道题目也可以用别的STL容器或者数组做
map,比set还慢了几毫秒……
#include <iostream>
#include <map>
using namespace std;
map <int, int> mp;
int main()
{
int n, x, y = 0;
cin >> n;
for(int i = 0; i <= n - 1; i++)
{
cin >> x;
if(x != 0)
{
mp[x] = i;
}
}
cout << mp.size() << endl;
return 0;
}
说下map和set
map和set均是STL容器中的一种
map:
好,现在讲下map
大家都知道数组,比如:
int arr[10005], x, y;
cin >> x >> y;
arr[x] = y;
数组下标只能为int,但如果像这道题目,数组肯定不行
用map可以做到下标和值为任何数据类型
map是STL容器中的映射类型,定义方式如下:
map <下标数据类型,值数据类型> 映射名称;
如:
map <int, string> ma;
ma[666] = "AC";
cout << ma[666] << endl;
运行,输出:AC
map常用函数有:
clear()//清空映射
begin()//返回映射的首个元素的迭代器
end()//映射最后一个元素的迭代器
erase()//删除……处的下标
empty()//判断映射是否为空,空返回true,否则返回false
等
和vector等STL容器一样,也有迭代器
声明如下(两种)
1、map <下标数据类型,值数据类型>::iterator 迭代器名称;
2、auto 迭代器名称 = 值;(c++11)
注意,迭代器和map映射中map <下标数据类型,值数据类型>要一样
迭代器的使用方式是这样的
例如一下代码:
map <string, int> ma;
ma["a"] = 1;
ma["c"] = 2;
ma["b"] = 3;
for(map <string, int>::iterator it = ma.begin(); it != ma.end(); it++)
{
cout << it -> first << " " << it -> second << " ";
}
运行结果:a 1 b 3 c 2
可以看出,map在建立映射时,会将下标从小到大排序,first输出下标,second输出值,输入也是一样,但输入不能输入first的下标。
set:
set也是STL容器中的一个,拥有自动去重和从小到大排序功能
定义方式如下:
set <数据类型> 名称;
set有一个弊端,比较难访问某个位置的值
set的算法和map一样采用的是红黑树
set迭代器:
set <数据类型>::iterator 迭代器名称
auto 迭代器名称 = 值(c++11,auto必须赋初值)
set和map的很多函数相似,就不一一列举了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现