解题思路:
        看了一下其他人的思路,感觉分明把一个极其简单题目给认为搞复杂了,题目大致分为两个功能,第一:排序,第二:去重,这与我们C++的STL里面的set方法直接就是重合了好么?


参考代码:

#include<bits/stdc++.h>
using namespace std;
set<int> se;
int main(){
	int n;
	cin>>n;
	for(int i=0,k;i<n;i++){
		cin>>k;
		se.insert(k);
	}
	cout<<se.size()<<endl;
	for(set<int>::iterator it=se.begin();it!=se.end();it++){
		cout<<*it<<' '; 
	}
	return 0;
}

直接解决,而且比其他的代码都快很多。


如果你连STL是什么都不知道的话,请点开这个 https://baike.baidu.com/item/STL/70103?fr=aladdin

简单的来说一下set


一.解释

  关于set,必须说明的是set关联式容器。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。 

总结就是a.其存粹数据唯一,无重复数据;b.其存储后会自动排序(默认从小到大)。

二.用法

1.头文件

#include <set> 

2.定义 set<type> s;

3.常用操作

set<int> s    定义一个set容器 类型为int型

s.begin()     返回指向第一个元素的迭代器

s.end()       返回指向最后一个元素之后的迭代器,不是最后一个元素

s.clear()     清除所有元素

s.count()     返回bool型,有返回1,无返回0

s.empty()     如果集合为空,返回true

s.erase()     删除集合中的元素

s.find()      返回一个指向被查找到元素的迭代器,如果没找到则返回end()

s.insert()    在集合中插入元素

s.size()      集合中元素的数目

s.swap()      交换两个集合变量


可以说,利用特性就可以快速解决了。

同时提一下,set容器的底层是一颗红黑树,这就说明了其储存并非线性,而是散列性质,这也是其查找的速度要小于O(n)的原因,也同时由于set容器底层是一颗红黑树,就决定了其无法应用于sort这类STL的模板排序方法里面(诶,为什么本身就是排好序的,还需要我再排序呢???),思考一下,如果需要逆序,或者定序排序,则需要怎么做呢?

如果逆序的时候相当简单,只需要再定义的时候加上一个规范就可以了,如:

set<int,less<int>> se;       //升序
set<int,greater<int>> se;        //降序

但如果是定序呢?当然你可以设置一个定序类型,这样可能比较麻烦,同时,你可以利用一个vector做中间变量进行定序排序,利用第三者完成你想要的功能。


set还有一个兄弟模板

叫做:multiset<type> name;其与set的区别就是set不能存储重复的数据,而multiset可以存储重复的内容。


(STL万岁......没药救了)

159.jpeg

点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论