【模板】排序(1)

题目描述

给定一个大小为n的整型数组a,你需要对其按照升序排序并进行去重。

输入

第一行:一个整数n。(1≤n≤2×10^5)

第二行:n个整数,表示数组a的所有元素。(−10^9≤ai​≤10^9,1≤i≤n)

输出

共一行,输出升序排序且去重后的数组a。

样例输入 
8
2 0 2 3 0 7 1 7
样例输出 
0 1 2 3 7

思路,使用sort()完成从小到大的排序,

去重可以用unique函数和erase函数配合

unique的作用是“去掉”容器中相邻元素的重复元素,它会把重复的元素添加到容器末尾,而返回值是去重之后的尾地址

C++中unique函数_c++ unique-CSDN博客

erase的作用是删除元素,erase(first,last)表示删除从first到last之间的字符(first和last都是迭代器),所以这一段的作用就是从去重之后的尾地址开始到最后一个元素的位置,将重复的元素全部删除。C++中erase的用法_erase的用法 c++-CSDN博客

a.erase(unique(a.begin(),a.end()),a.end());  //从a中删除重复的元素 

关于for循环: 

	for(int i=0;i<a.size();i++)  //输出数组内元素
	{
		cout<<a[i]<<' ';  
	}

上面这段代码与下面的是一样的作用 

范围(range-based)for 循环是 C++11 标准引入的特性,如果要使用,将编译器改为C++11即可,具体见Dev C++ [Error] range-based 'for' loops are not allowed in C++98 mode-CSDN博客

	for(auto &i : a)  //使用范围(range-based)for 循环遍历向量 "a" 中的元素,将每个元素赋值给变量 "i"
	{
		cout<<i<<' ';  
	}

这是一种更简洁的for循环。 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<int> a; //定义整数数组 
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		a.push_back(x);  //将输入的数字添加到a数组末尾 
	}
	sort(a.begin(),a.end());  //按从小到大顺序排序 
	a.erase(unique(a.begin(),a.end()),a.end());  //从a中删除重复的元素 
	
	for(auto &i : a)  //使用范围(range-based)for 循环遍历向量 "a" 中的元素,将每个元素赋值给变量 "i"
	{
		cout<<i<<' ';  
	}
	return 0;
}

或者这样写:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<int> a; //定义整数数组 
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		a.push_back(x);  //将输入的数字添加到a数组末尾 
	}
	sort(a.begin(),a.end());  //按从小到大顺序排序 
	a.erase(unique(a.begin(),a.end()),a.end());  //从a中删除重复的元素 
	
	for(int i=0;i<a.size();i++)  //使用范围(range-based)for 循环遍历向量 "a" 中的元素,将每个元素赋值给变量 "i"
	{
		cout<<a[i]<<' ';  
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值