头文件

  • <algorithm> 比较、交换、查找、遍历、复制、修改等
  • <numeric> 序列上进行简单数***算
  • <functional> 一些模板类以声明函数对象

遍历算法

for_each 遍历容器
transform 搬运容器到另一个容器中

void myprint(int val){//也可以用仿函数实现
	cout<<val<<endl;
}
vector<int> v;
for(int i=0;i<10;i++){
	v.push_back(i);
}

for_each(v.begin(),b.end(),myprint);

查找算法

  • find 查找元素
  • find_if 按条件查找元素
  • adjacent_find 查找相邻重复元素
  • binary_search 二分查找法
  • count 统计元素个数
  • count_if 按条件统计元素个数
//1. find
vector<int> v={1,2,3,4,5);
find(v.begin(),v.end(),5);//查找5是否存在,返回一个迭代器
//对于自定义数据类型,需要重载==
bool operator==(const Person& p){
	if(this->name==p->name) return true;
    else return false;
}

//2.find_if
class greaterFive{
public:
  	bool func(){}
}
find_if(v.begin(),v.end(),func());
               
//3. adjacent_find 查找相邻重复的元素,返回相邻元素的第一个位置的迭代器
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(0);
v.push_back(3);
v.push_back(3);
               
vector<int>::iterator pos=adjacent_find(v.begin(),v.end());//返回第一个3的位置
               
//4. binary_search 查找指令元素是否存在,返回真或假,在无序序列中不可用
vector<int>v;
for(int i=0;i<10;i++){
	v.push_back(i);
}               
bool res=binary_search(v.begin(),v.end(),9);//查找9是否存在

//5. count
//对于自定义数据类型,需要重载==

//6. count_if
class ageGreater20
{
public:
  	bool operator()(const Person& p)
    {
    	return p.age>20;
    }
};

vector<Person> v;
v.push_back(make_pair("a",20));
v.push_back(make_pair("b",30));
int count=v.count_if(v.begin(),v.end(),ageGreater20());
//当年纪大于20时,count+1

排序算法

  1. sort
    看之前的例子
  2. random_shuffle
    洗牌 指定范围内的元素随机调整次序
#include <ctime>

srand((unsigned int)time(NULL));//根据时间生成一个随机数种子
random_shuffle(v.begin(),v.end());//{1,2,3,4,5,6}
  1. merge
    容器元素合并,并存储到另一个容器
    两个容器必须是有序的,结果也是有序的
vector<int> v1={1,2,3};
vector<int> v2={4,5,6};
vector<int> m;
m.resize(v1.size()+v2.size());//必须提前分配空间

merge(v1.begin(),v2.end(),v2.begin(),v2.end(),m.begin());
  1. reverse
    反转指定范围内的容器
    看之前的例子

拷贝和替换算法

  1. copy 将容器内指定范围的元素拷贝到另一个容器
//v2要提前分配空间
copy(v1.begin(),v1.end(),v2.begin());
  1. replace 将容器内指定范围的元素修改为新元素
replace(v.begin(),v.end(),20,2000);//所有的20替换为2000
  1. replace_if 满足条件下替换
class Greater20
{
public:
  	bool operator()(int val)
    {
    	return val>20;
    }
};

vector<int> v={10,20,30,40};
replace(v.begin(),v.end(),Greater20(),3000);//大于20的元素替换为3000
  1. swap 互换2个容器的元素

算术生成算法

  1. accumulate
    计算区间内容器元素累计总和
#include<numeric>

vector<int> v={1,2,3,4,5};
accumulate(v.begin(),v.end(),0);//计算从0开始的元素之和,15
  1. fill
#include<numeric>

vector<int> v;
v.resize(10);//默认为0

fill(v.begin(),v.end(),100);//填充为100

集合算法

  1. set_intersection
    求两个容器的交集

  2. set_union
    求并集

  3. set_difference
    求差集

vector<int>v1={1,2,3,4,5};
vector<int>v2={1,2,6,7,8};
vector<int>res;

void myprint(){
...
}

res.resi***(v1.size(),v2.size()));
vector<int>::iterator end=set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),res.begin());
for_each(res.begin,end,myprint);//end不要用m.end(),用返回的迭代器