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