# 自动去重和排序

> 发布于：2020-10-26 | 分类：刷题 | 原文：https://www.imbailey.cn/post/array-deduplication-and-sorting-2

【题目描述】

明明想在学校中请一些同学一起做一项问卷调查，为了实验的客观性，他先用计算机生成了N个1到1000之间的随机整数（N≤100），对于其中重复的数字，只保留一个，把其余相同的数去掉，不同的数对应着不同的学生的学号。然后再把这些数从小到大排序，按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

【输入】

有2行。第1行为1个正整数N ，表示所生成的随机数的个数。第2行有N个用空格隔开的正整数，为所产生的随机数。

【输出】

共2行，第1行为1个正整数M，表示不相同的随机数的个数。第2行为M个用空格隔开的正整数，为从小到大排好序的不相同的随机数。

For example:

Input

Result

10  
20 40 32 67 40 20 89 300 400 15

8  
15 20 32 40 67 89 300 400

## 分析

这题真的困扰了我好久妈了个逼的，一开始我用最基本的语法去写，结果我他妈直接写完报错，我以为是我的算法不够好，就发到唐老师群里求助，结果他说我上课不听课...我也想上他的课呀...

后来我去网上搜，有个人的博客里有这题，他用到了一个set，这个东西我不太清楚是啥，于是翻开我的c++primer去找，但是这本书实在是太专业了，我得把前面的看懂才能彻底搞懂这个东西，而且今天晚上我发现我要想搞懂这本书实在是太难了，我需要付出很多很多时间和精力。而我有更重要的任务去做，比如刷程序设计的题目，比如学习python，我真的不想再自己去碰一鼻子灰了，还是跟着导师的步子来吧。

所以今天晚上，我得明确我的学习线路：1.c++学习听老师的话，就以做题为主，不会的上百度搜，遇到一个点搞懂一个点就行了。2.python学习得跟上进度，提上日程。3.数学的学习也不能落下。4.在寝室里的时候就学学办公软件excel什么的。5.另外，多看看书，了解时局，和历史，最近对中国经济确实挺感兴趣。

## 答案

```
#include <iostream>
#include <bits/stdc++.h>  //这玩意是万能头文件

using namespace std;

int main()
{
    int n;
    cin >> n;
    int x;
    set<int>s;  //set可以自动进行排序，默认是从小到大
    for(int i=0; i<n; i++)
    {
        cin >> x;
        s.insert(x);  //这个有点像python的.append
    }
    cout<<s.size()<<endl;
    for(auto x:s)
        cout << x <<' ';
    return 0;

}
```

#### 其它说明

for(auto i:v)

cout<<i;

遍历v里面的每一个元素。

1.  begin(); // 返回指向第一个元素的迭代器
2.  end(); // 返回指向迭代器的最末尾处（即最后一个元素的下一个位置）
3.  clear(); // 清除所有元素
4.  count(); // 返回某个值元素的个数

6.  empty(); // 如果集合为空，返回true

8.  equal\_range(); //返回集合中与给定值相等的上下限的两个迭代器

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

12.  find()–返回一个指向被查找到元素的迭代器

14.  get\_allocator()–返回集合的分配器

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

18.  lower\_bound()–返回指向大于（或等于）某值的第一个元素的迭代器

20.  key\_comp()–返回一个用于元素间值比较的函数

22.  max\_size()–返回集合能容纳的元素的最大限值

24.  rbegin()–返回指向集合中最后一个元素的反向迭代器

26.  rend()–返回指向集合中第一个元素的反向迭代器

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

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

32.  upper\_bound()–返回大于某个值元素的迭代器

34.  value\_comp()–返回一个用于比较元素间的值的函数
