C++常用库函数
reverse() (非常的重要)
用来反转序列,接下来举例子
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int b[] = {1,2,3,4,5,6};
vector<int> a({1,2,3,4,5});
reverse(a.begin(),a.end()); //反转vector
for(int x:a) cout << x << ' ';
cout << endl;
reverse(b,b+6); // 反转数组
for(int x:b) cout << x << ' ';
}
unique()
返回去重之后的尾迭代器或者指针,仍然为前闭后开,即这个迭代器是去重之后末尾元素的下一个位置。该函数常用于离散化,利用迭代器(或指针)的减法,可计算出去重后的元素个数。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int a[] = {1,4,2,3,3,4,4};
vector<int> b({1,1,3,5,5,5,6});
int m = unique(a,a+7) - a; //返回去重之后元素的个数
cout << m << endl;
for(int i = 0;i < m;i++) cout << a[i] << ' ';
cout << endl;
for(int x:a) cout << x << ' '; // 从这个例子就可以看出,unique其实并没有把重复的值去除,只是改变了指针。
cout << endl;
// int n = unique(b.begin(),b.end()) - b.begin();
// cout << n << endl;
// for(int i = 0;i < n;i++) cout << b[i] << ' ';
// cout << endl;
// 巧用erase()函数,直接可以得到去重后的数组
b.erase(unique(b.begin(),b.end()),b.end());
for(auto x:b) cout << x << ' ';
cout << endl;
}
random_shuffle——随机打乱
#include<iostream>
#include<algorithm>
#include<vector>
#include<ctime>
using namespace std;
int main()
{
vector<int> a({1,1,2,3,5});
srand(time(0)); //time(0)返回从现在到1997年1月1日的秒数
random_shuffle(a.begin(),a.end());
for(int x:a) cout << x << ' ';
cout << endl;
}
sort
对两个迭代器(或指针)指定的部分进行快速排序。可以在第三个参数传入定义大小比较的函数,或者承载“小于号”运算符。
升序和逆序
#include<iostream>
#include<algorithm>
#include<vector>
#include<ctime>
using namespace std;
int main()
{
vector<int> a({1,9,2,3,5});
srand(time(0)); //time(0)返回从现在到1997年1月1日的秒数
random_shuffle(a.begin(),a.end());
for(int x:a) cout << x << ' ';
cout << endl;
//sort(a.begin(),a.end());
sort(a.begin(),a.end(),greater<int>()); // 加一个参数greater<int>(),就可以实现从大到小排序
for(int x:a) cout << x << ' ';
cout << endl;
}
自己定义如何排
sort(a.begin(),a.end(),cmp);
//sort(a.begin(),a.end(),greater<int>()); // 加一个参数greater<int>(),就可以实现从大到小排序
结构体排序
因为结构体中没有比较函数,所以我们得定义一个cmp来充当比较函数
#include<iostream>
#include<algorithm>
#include<vector>
#include<ctime>
struct Rec
{
int x,y;
}a[5];
bool cmp(Rec a,Rec b)
{
return a.x > b.x;
}
using namespace std;
int main()
{
for(int i = 0;i < 5;i++)
{
a[i].x = i;
a[i].y = -i;
}
for(int i = 0;i < 5;i++) printf("(%d,%d) ",a[i].x,a[i].y);
cout << endl;
sort(a,a+5,cmp);
for(int i = 0;i < 5;i++) printf("(%d,%d) ",a[i].x,a[i].y);
}
如果我们不想自己定义比较函数,我们可以在结构体中承载小于号
struct Rec
{
int x,y;
bool operator< (const Rec &t)const
{
return x > t.x;
}
}a[5];
lowwer_bound
upper_bound 二分查找
int a[]={1,2,4,5,7};
int *t = lower_bound(a,a+5,3); //找到数组中严格大于等于3的数的位置
int *q = upper_bound(a,a+5,5); //找到数组中严格大于5的数的位置
cout << *t << ' ' << *q << endl;