C++中有关算法的头文件都包含在:algorithm 里面
1 count
统计范围 [first, last) 中满足特定判别标准的元素数。
- 计数等于 value 的元素。
1.1 用法
传入first、end迭代器以及要统计的value值,返回统计的数量
int c = count(v.begin(), v.end(), value);
如果value是自定义类型的对象时,则需要重载==操作符,因为count底 层判断时,使用 == 符号,而当要统计自定义类型数据时,需要在设计class时需要重载 == 操作符。
class Person{
public:
string name;
int age;
bool operator== (const Person& p){
return this->age == p.age;//此处统计的时age相等的对象
}
};
2 count_if
统计范围 [first, last) 中满足特定判别标准的元素数。
- 计数谓词 p 对其返回 true 的元素。
自定义类型数据
2.1用法
第三个参数是对于if的仿函数或者函数
int c = count_if(v.begin(), v.end(), greaterTen());
例子:该仿函数的作用是判断对象的age是否大于10;
class greaterTen{
public:
bool operator() (const Person& p){
return p.age > 10;
}
}
3 sort
常常用来进行排序,默认升序,如果要改变排序规则或者对自定义类型数据就需要自己编写规则函数
3.1用法
1.sort(v.begin(), v.end()); 内置数据类型,默认升序排序
2.sort(v.begin(), v.end(), myRule()); 自定义类型或者改变排序规
3.2仿函数代码
自定义类型数据, 以age降序进行排序
class myRule{
public:
bool operator() (const Person& p1, const Person& p2){
return p1.age > p2.age;
}
};
4 random_shuffle
随机打乱容器内部的数据
4.1 用法
random_shuffle( v.begin(), v.end() );
5 merge
作用:将两个有序的序列合并成一个有序的序列放在新的容器上
注意点:合并的两个容器的顺序必须跟排序方法一样,默认使用升序。
5.1用法
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.vegin());默认升序
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.vegin(), myRule());自定义排序规则
5.2仿函数代码
关于比较的仿函数代码基本一样,都是两个参数进行对比
class myRule{
public:
bool operqtor() (const Person& p1, const Person& p2){
return p1.age > p2.age; 按照age降序的排序规则
}
}
6 set_intersection
作用:找交集, 从两个有序的容器中找到交集,将交集复制到新的容器中
6.1用法
1.默认的排序规则
set_intersection(v1.begin(). v1.end(), v2.begin(), v2.end(), v3.begin());
2。使用自定义的排序规则, 所有自定义类型的数据都要设计排序规则函数以及重载==
set_intersection(v1.begin(). v1.end(), v2.begin(), v2.end(), v3.begin(), myRule());
6.2仿函数以及重载==写法
重载:
bool operator== (const Person& p){
if( this->age == p.age){
return ture;
}else{
return false;
}
}
排序规则仿函数,以升序的方式排序
class myRule{
public:
bool operator() (const Person& p1, const Person& p2){
return p1.age < p2.age;
}
};