题解 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 迭代器名称;

2auto 迭代器名称 = 值;(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++11auto必须赋初值)
  
set和map的很多函数相似,就不一一列举了
posted @   HappyBobb  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示