ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

stl:nth_element&unique

2022-06-28 23:04:30  阅读:173  来源: 互联网

标签:include 函数 stl 元素 nth int unique 重复


nth_element

参考:(48条消息) STL 之 nth_element详解_sugarbliss的博客-CSDN博客_nth_element

头文件:#include<algorithm>
作用:
默认是求区间第k小的,函数只是把下标为k的元素放在了正确位置,对其它元素并没有排序,当然k左边元素都小于等于它,右边元素都大于等于它,所以可以利用这个函数快速定位某个元素。

nth_element(a,a+k,a+n)

第一个项:数组;第二个项:要求元素的下标;第三个项:终地址+1
nth_element(a,a+2,a+9),将下标为2,也就是第3个数放在正确的位置,求的是第3小的数a[2]。(下标从零开始)
若求最第k大,可借助cmp
bool cmp(int a, int b)
{
return a > b;
}

nth_element(c,c+2,c+9,cmp);

例:P1923 【深基9.例4】求第 k 小的数

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=5000000+10;
 5 int a[maxn];
 6 int n,k;
 7 int main()
 8 {
 9     ios::sync_with_stdio(false);
10     cin.tie(0);
11     cout.tie(0);
12     cin>>n>>k;
13     for(int i=0;i<n;i++)
14     {
15         cin>>a[i];
16     }
17     nth_element(a,a+k,a+n);
18     cout<<a[k]<<endl;
19     return 0;
20 }

 

 unique ([juˈniːk])

头文件:#include<algorithm>
这里引用大佬的博客,大佬写的太好了,我直接照搬orz

(48条消息) unique 函数 详解_生于忧患,死于安乐2017的博客-CSDN博客_unique函数

unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。

二.函数原型

unique函数的函数原型如下:

1.只有两个参数,且参数类型都是迭代器:

iterator unique(iterator it_1,iterator it_2);

第一项:首地址;第二项终地址+1

这种类型的unique函数是我们最常用的形式。其中这两个参数表示对容器中[it_1,it_2)范围的元素进行去重(注:区间是前闭后开,即不包含it_2所指的元素),返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。

unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。

2.unique函数通常和erase函数一起使用,来达到删除重复元素的目的。(注:此处的删除是真正的删除,即从容器中去除重复的元素,容器的长度也发生了变换;而单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化)关于erase函数的用法,可以参考:http://www.cnblogs.com/wangkundentisy/p/9023977.html。下面是一个具体的实例:

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cassert>
 4 using namespace std;
 5  
 6 int main()
 7 {
 8  
 9     vector<int> a ={1,3,3,4,5,6,6,7};
10     vector<int>::iterator it_1 = a.begin();
11     vector<int>::iterator it_2 = a.end();
12     vector<int>::iterator new_end;
13  
14     new_end = unique(it_1,it_2); //注意unique的返回值
15     a.erase(new_end,it_2);
16     cout<<"删除重复元素后的 a : ";
17     for(int i = 0 ; i < a.size(); i++)
18         cout<<a[i];
19     cout<<endl;
20  
21 }

 

 

这里,他的返回值是去重后序列(这个序列不含有重复数值)的末尾的下一个元素,在上边代码中,

unique后,数组顺序为:1,3,4,5,6,7,X(代表重复数字,具体哪个不重要),X。他的返回值就是第一个重复数字的地址,所以,

能用erase 实现彻底去重。

例:P1059 [NOIP2006 普及组] 明明的随机数

P1059 [NOIP2006 普及组] 明明的随机数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=105;
 5 int a[maxn],n;
 6 int main()
 7 {
 8     cin>>n;
 9     for(int i=0;i<n;i++)
10     {
11         cin>>a[i];
12     }    
13     sort(a,a+n);
14     int cnt=unique(a,a+n)-a;//unique返回的是第一个重复数据的地址,
15                             //减去首地址刚好是下标(有序个数) 
16     cout<<cnt<<endl;
17     for(int i=0;i<cnt;i++)
18     {
19         cout<<a[i]<<" ";
20     }
21     return 0;
22 }

 

标签:include,函数,stl,元素,nth,int,unique,重复
来源: https://www.cnblogs.com/inawaken/p/16421538.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有