STL
1、set:
#include<bits/stdc++.h> #define pf(a) printf("%d ",a) #define phn puts("") #define F(i,a,b) for(rg int i=a;i<=b;++i) #define rg register #define il inline #define LL long long using namespace std; int read(); multiset<int>s; int n,a[100010]; int main(){ n=read();F(i,1,n)a[i]=read(); s.clear(); F(i,1,n)s.insert(a[i]); for(multiset<int>::iterator p=s.begin();p!=s.end();++p){ printf("%d",*p); } phn;//1235778 multiset<int>::iterator p; if((p=s.find(3))!=s.end()){ s.erase(p); } s.erase(7); for(multiset<int>::iterator p=s.begin();p!=s.end();++p){ printf("%d",*p); } phn; //1258 } il int read(){ int s=0;char ch; while(ch=getchar(),!isdigit(ch)); for(;isdigit(ch);s=s*10+(ch^48),ch=getchar()); return s; } /* g++ 4.cpp -g ./a.out 7 5 3 1 8 2 7 7 */
iterator:迭代器(类似指针)。STL每个类型都有特定专用迭代器。
set:自动去重。
multiset:不去重,可重复。
multiset的erase(x)会清空全部这个数值的数。
单点清空要用erase(find(x))
2、sort函数参数
(1)start表示要排序数组的起始地址;
(2)end表示数组结束地址的下一位;
(3)cmp用于规定排序的方法,可不填,默认升序。
sort(a+1,a+n+1):对1~n排序。
sort(a,a+n):对1~n-1排序。
内部是快速排序,最坏n^2,一般nlog
3、nth_element:
作用:nth_element作用为求第n大的元素,并把它放在第n位置上,下标是从0開始计数的,也就是说求第0小的元素就是最小的数。
最坏n^2,一般O(n)
仅仅能确定a[k]是数列中第k大的数,并将小于k的放在左边,大于的放在右边,但不保证左右两边的内部有序。
nth_element()函数不过将第n大的数排好了位置,并不返回值。
#include<iostream> #include<algorithm> using namespace std; int main() { int a[]={1,3,4,5,2,6,8,7,9}; int i; cout<<"数列例如以下:"<<endl; for(i=0;i<9;i++) cout<<a[i]<<" "; nth_element(a,a+5,a+9); cout<<endl<<"输出第五大的数: "<<a[4]<<endl; //注意下标是从0開始计数的 return 0; }
4、unique()返回数组end位置,即数组结尾的下一个位置。
所以要减首地址(-a-1),得到数组大小。
lower_bound返回查询元素在数组中位置,减去起始位置的上一个位置,即为排名。(-a)
lower_bound:>= upper_bound >
5、priority_queue <int,vector<int>,greater<int> > q;小根堆
priority_queue <int,vector<int>,less<int> >q;大根堆
(不需要#include<vector>头文件
注意后面两个“>”不要写在一起,“>>”是右移运算符)
6、pow(x,k)函数:参数和返回值都是double,用于求几次幂,(开几次根)。
7、next_permutation:
不确定是否需要sort.
sort(a+1,a+n+1); do{ }while(next_permutation(a+1,a+n+1));
Informatik verbindet dich und mich.
信息将你我连结。