主要的头文件#include <algorithm> < functional> <numeric>

遍历算法:
for_each、transform(搬运容器到另一个容器中 )
void print1(int val)
{
    cout << val <<" ";
}
for_each (v.begin(),v.end() , print1)或者用仿函数的形式遍历:
class print2{
public:
    void operator()(int val)
    {
        cou <<val <<" ";
    }
}for_each(v.begin(),v.end(),print2()) ; 不同于上述,此处需要传入匿名函数对象
对于transform搬运算法:
vector <int> vtarget; //创建目标容器
vtarget.resize(v.size()) ; //目标容器必须提前开辟空间,与原vector一致,否则无法搬运
class trans1{
public :
    int operator () (int val )
    {
        return val;    
    }
}transform (v.begin();v.end();vtarget.begin(),trans1()); //最后需要加个仿函数 ,注意中间的vtarget.begin()迭代器
查找算法:
find //查找元素 ,找到返回指定元素的迭代器,找不到返回结束迭代器end();
                利用find可以在容器中找指定的元素,返回值是迭代器,使用迭代器接收
 find_if        //按条件查找元素 ,三个参数:开始迭代器、结束迭代器、谓词(返回bool的仿函数)
vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
if (it ==v.end()) {...}  //没找到
else{} ;  //找到了对于查找自定义数据类型:
class Person{
public:
    person(string name ,int age){
    this->m_Name = name;
    this->m_Age = age;
}
public:
    string m_Name;
    int m_Age ;
};
class Greater{
    bool operator()(Person &p){
    return p.m_Age >20;    
}
}
 
vector <Person>::iterator it  = find_if (v.begin() , v.end() , Greater());
if(it == v.end()){};
else {};adjacent_find //查找相邻重复元素,返回相邻重复元素的第一个元素迭代器
vector<int>::iterator pos = adjacent_find(v.begin(), v.end());
binary_search        //二查找法,查找指定元素是否存在,但是只能在有序数组中使用,返回一个bool类型,速度快,logN时间复杂度
 bool ret =binary_search(v.begin(),v.end(),9 ) //查找容器中是否有9元素,但是只能是升序,降序需要提供重载版本
  //升序
    vector<int> v;
    for (int i = 0; i < 10; i++) {
        v.push_back(i);
            }
    bool ret = binary_search(v.begin(), v.end(), 8);
    if (ret == true) {
        cout << "true" << endl;
    }
    else {
        cout << "false" << endl;
    }
    //测试降序是否适用
    vector<int> v1;
    for (int i = 10; i > 0; i--) {
        v1.push_back(i);
    }
    bool ret2 = binary_search(v1.begin(), v1.end(), 8);
    if (ret2 == true) {
        cout << "true" << endl;
    }
    else {
        cout << "false" << endl;
    }
//结果输出:
true
false
 count        //统计元素个数,返回一个int整形。
int num=count(v.begin(),v.end(),40);
 count_if        //按条件统计元素个数
int num = count_if (v.begin(),v.end(),Greater()) ; 最后一个参数为谓词
或者自定义数据类型:

排序算法:
sort(v.begin(),v.end()); //升序排列,降序需要添加<functional>中的模板
void myPrint(int val)
{cout << val <<" ";}
sort(v.begin(),v.end(),greater<int>());
for_each (v.begin(),v.end(),myPrint);
打乱算法:random_shuffle
srand((unsigned int) time (NULL)); // 使用时间作为随机数种子来确保真正的随机
random_shuffle(v.begin(),v.end());
合并算法:merge(前提两个容器必须有序,合并之后的也是有序的)
//目标容器
 vector<int>vTarget;
vTarget.resize(v1.size()+v2.size()); // 前提必须要给目标容器分配内存!!!
 merge(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());
数据反转:reverse
reverse(v.begin,v.end());
拷贝和替换算法:
vector <int> v2;
v2.resize(v1.size()); //注意记得先开辟空间!
copy(v1.begin(),v1.end(),v2.begin());
替换算法:replace
replace(v1.begin(),v1.end() ,20 , 2000) ; // 把所有的20替换为2000
按照条件替换:replace_if
一般构建仿谓词来作为参数
构建谓词(把大于等于30 的数替换)
class Greater30
{
public :
bool operator() (int val ){
return val>=30;
}
}
replace_if (v1.begin() , v1. end() , Greater30() ,30000) ; 把大于等于30的数替换为30000;
常用算数生成算法:#include <numeric>
accumulate   // 计算容器元素累计总和,可以设置起始值
 fill // 向容器中添加元素,填充所有空间为指定的值
int sum = accumulate(v.begin() , v.end() , value); //value 表示起始的累加值

常用的集合算法: (此处的集合并不指set容器,而是数学概念)
求交集: set_ intersection (原容器必须是有序序列)
vector <int> vtarget;
vtarget.resize(min(v1.size(),v2.size())) ; //这样做是考虑到最大的目标容器内存情况:原容器1包含原容器2
vector<int>::interator itEnd=set_ intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),vtarget.begin());  //返回迭代器,指向新的vtarget的最后
 打印输出:
 for_each (vTarget.begin(),itEnd , myprint());
求并集 : set_union(原容器必须是有序序列)
vtarget.resize(v1.size()+v2.size()) ; //这样做是考虑到最大的目标容器内存情况:原容器1与原容器2无交集
vector<int>::interator itEnd=set_ union(v1.begin(),v1.end(),v2.begin(),v2.end(),vtarget.begin()); //返回迭代器,指向新的vtarget的最后
打印输出:
 for_each (vTarget.begin(),itEnd , myprint());
求差集 : set _difference



















