其他分享
首页 > 其他分享> > stl:nth_element&unique

stl:nth_element&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