stl算法

算法主要由
是所有stl头文件中最大的一个,其中涉及功能到比较,交换,查找边历,复制,修改,反转,排序,合并等
体积很小,只包括在几个序列容器上进行简单运算的模板函数
定义了一些模板类,用以声明函数对象
1、常用边历算法
for_each算法
正向遍历,逆向遍历
for_each绑定参数
for_each修改元素值
for_each返回值
transform算法
容器,目标容器,算法;


#include<algorithm>
#include<iostream>
#include<vector>
#include<functional>
#include<numeric>
using namespace std;
 
//for_each算法
class  print{
public:
    print() :count(0){}
    void operator()(int v){
        cout << v << " ";
 
    }
    int count;
};
void test01()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
 
    }
    /*
    template<class _InIt,
    class _Fn1> inline
    _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
    {   // perform function for each element
    _DEBUG_RANGE(_First, _Last);
    _DEBUG_POINTER(_Func);
    _For_each(_Unchecked(_First), _Unchecked(_Last), _Func);
 
    return (_STD move(_Func));
    }*/
    //他是拷贝过来的
    print p1;
    print p2=for_each(v.begin(), v.end(), p1);
    cout << endl;
    cout << "count:" << p1.count << endl;
    cout << "count:" << p2.count << endl;
 
 
     
}
//transform算法
class myplus100{
    int operator()(int v){
        return v + 100;
    }
};
class myminute{
public:
    int operator()(int v1, int v2){
        return v2 - v1;
    }
};
void test02()
{
    /*
    vector<int> v1,v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
 
    }
    //第一种方式,一个容器经过运算,把结果放进目标容器v2
    v2.resize(v1.size());
    for_each(v2.begin(), v2.end(), print());
    cout << endl;
    transform(v1.begin(), v1.end(), v2.begin(), myplus100());
    for_each(v2.begin(), v2.end(), print());
    cout << endl;*/
    //第二种方式
    vector<int> v3, v4, v5;
    for (int i = 0; i < 10; i++)
    {
        v3.push_back(i);
        v4.push_back(i+1);
 
    }
    v5.resize(v3.size());
    for_each(v5.begin(), v5.end(), print());
    cout << endl;
    transform(v3.begin(), v3.end(), v4.begin(), v5.begin(), myminute());
    for_each(v5.begin(), v5.end(), print());
    cout << endl;
 
}
int main()
{
    test02();
    return EXIT_SUCCESS;
}

2、常用的查找算法
find算法
find_if算法
count算法
count_if算法
adiacent_find算法,返回相零的重复元素出现的第一个位置
binary_search算法,二分查找法,需要容器中元素有序,需要排序

#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
 
using namespace std;
 
class print{
public:
    void operator()(int v){
        /*if (v!=0)
        cout << v << " ";
        */
        cout << v << " ";
    }
};
 
//find
void test01()
{
    vector<int> v;
    v.push_back(8);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);
    /*
    template<class _InIt,
    class _Ty> inline
    _InIt find(_InIt _First, _InIt _Last, const _Ty& _Val)
    {   // find first matching _Val
    _DEBUG_RANGE(_First, _Last);
    return (_Rechecked(_First,
        _Find(_Unchecked(_First), _Unchecked(_Last), _Val)));
    }*/
    vector<int>::iterator pos = find(v.begin(), v.end(), 4);
    if (pos == v.end())
    {
        cout << "没有找到" << endl;
    }
    else
    {
        cout << *pos << endl;
    }
    //for_each(v.begin(), v.end(), print());
}
 
class student{
public:
    student(int id, int age) :id(id), age(age){}
    int id;
    int age;
    bool operator==(const student& s){
        if (this->id == s.id && this->age == age)
        {
            return true;
        }
        else
        {
            return false;
        }
        return this->id == s.id && this->age == s.age;
    }
};
 
 
 
//查找对象
void test02()
{
    vector<student> v;
    student s1(1, 2), s2(3, 4), s3(5, 6);
    v.push_back(s1);
    v.push_back(s2);
    v.push_back(s3);
    vector<student>::iterator pos = find(v.begin(), v.end(), s1);
    if (pos != v.end()){
        cout << "zhaodao" << pos->age <<" "<< pos->id << endl;
    }
    else{
        cout << "没有找到" << endl;
    }
}
//find_if
class mycompare03{
public:
    bool operator()(int v){
        if (v > 2){
            return true;
        }
        else{
            return false;
        }
    }
};
void test03()
{
    vector<int> v;
    v.push_back(8);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);
    //find_if(v.begin(), v.end(), mycompare03());
    vector<int>::iterator pos = find_if(v.begin(), v.end(), mycompare03());
    if (pos == v.end())
    {
        cout << "没有找到" << endl;
    }
    else
    {
        cout << *pos << endl;
    }
}
//ad_jacent_find查找相邻重复元素,并返回第一个重复元素出现的位置
void test04()
{
    vector<int> v;
    v.push_back(8);
    v.push_back(4);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);
    /*_FwdIt adjacent_find(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
    {   // find first satisfying _Pred with successor
    _DEBUG_RANGE(_First, _Last);
    _DEBUG_POINTER(_Pred);
    return (_Rechecked(_First,
        _Adjacent_find(_Unchecked(_First), _Unchecked(_Last), _Pred)));
    }*/
    vector<int>::iterator pos = adjacent_find(v.begin(), v.end());
    if (pos == v.end())
    {
        cout << "没有找到" << endl;
    }
    else
    {
        cout << *pos << endl;
    }
}
 
//binary_search二分查找法
void test05()
{
    //binary_search需要对有序的元素查找
    vector<int> v;
    v.push_back(8);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);
    sort(v.begin(), v.end());
 
    /*template<class _FwdIt,
    class _Ty> inline
    bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
    {   // test if _Val equivalent to some element, using operator<
    return (_STD binary_search(_First, _Last, _Val, less<>()));
    }*/
    bool flag = binary_search(v.begin(), v.end(),11);
    if (flag)
    {
        cout << flag << endl;
    }
    else
    {
        cout << "没有找到" << endl;
    }
}
 
class mycompare06{
public:
    bool operator()(int v){
        return v > 2;
    }
};
//count count_if
void test06()
{
    //统计那个元素出现的次数
    vector<int> v;
    v.push_back(3);
    v.push_back(8);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);
    sort(v.begin(), v.end());
 
    int n=count(v.begin(), v.end(),3);
    cout << "n" << n << endl;
    n = count_if(v.begin(), v.end(), mycompare06());
    cout << "n" << n << endl;
     
}
 
int main()
{
    test06();
    return EXIT_SUCCESS;
}

3、常用的排序算法(需要容器支持随机访问,list不可以)
sort算法
merge算法(将两个容器中元素合并,放在第三个容器中,两个容器中元素必须是有序的)
merge(iterator beg,iterator end,iterator beg,iterator end,iterator dest)
random_shuffle算法(将容器元素打乱)
reverse算法(将容器中元素反转)
4、常用的拷贝替换算法
copy算法
replace算法(替换)
replace(iterator beg,iterator end,oldvalue,newvalue)
replace_if算法(把所有满足条件的元素全部替换)
swap算法(交换)

#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
 
using namespace std;
 
class print{
public:
    void operator()(int v){
        /*if (v!=0)
        cout << v << " ";
        */
        cout << v << " ";
    }
};
 
//copy
void test01()
{
    vector<int> v1, v2;
    for (int i = 0; i <= 10; i++)
    {
        v1.push_back(i);
    }
    v2.resize(v1.size());
    copy(v1.begin(), v1.end(), v2.begin());
    for_each(v2.begin(), v2.end(), print());
}
//replace
class mycompare02{
public:
    bool operator() (int v){
        return v > 5;
    }
};
void test02()
{
    vector<int> v1;
    for (int i = 0; i <= 10; i++)
    {
        v1.push_back(i);
    }  
    for_each(v1.begin(), v1.end(), print());
    cout << endl;
    replace(v1.begin(), v1.end(), 3, 100);
    for_each(v1.begin(), v1.end(), print());
    cout << endl;
    //replace_if
    replace_if(v1.begin(), v1.end(), mycompare02(), 365);
    for_each(v1.begin(), v1.end(), print());
    cout << endl;
 
    //swap
    vector<int> v2;
    for (int i = 0; i <= 10; i++)
    {
        v2.push_back(i);
    }
    cout << "swap front ::" << endl;
    for_each(v2.begin(), v2.end(), print());
    swap(v1, v2);
    cout << endl;
    cout << "swap back ::" << endl;
    for_each(v2.begin(), v2.end(), print());
 
 
}
int main()
{
    test02();
    return EXIT_SUCCESS;
}

6、常用的算术生成算法
accumulate算法(将容器中元素累加)
fill算法

#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
 
using namespace std;
 
void test01()
{
    vector<int> v;
    for (int i=0; i <= 100; i++)
    {
        v.push_back(i);
    }
    //将元素中的值加完再加100
    int a=accumulate(v.begin(), v.end(), 100);
    cout << "n" << a<< endl;
}
 
class print{
public:
    void operator()(int v){
        cout << v << " ";
    }
};
void test02()
{
    vector<int> v;
    v.resize(100);//reserve(100)只开空间,未初始化
    fill(v.begin(), v.end(), 100);
    cout << "size" << v.size()<< endl;
    for_each(v.begin(), v.end(), print());
}
int main()
{
    test02();
    return EXIT_SUCCESS;
}

7、常用的集合算法
set_intersection算法(求交集)
set_union算法(并集)
set_difference算法(求两个集合的差集)



#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
 
using namespace std;
 
class print{
public:
    void operator()(int v){
        /*if (v!=0)
        cout << v << " ";
        */
    }
};
 
//求两个集合的交集
void test01()
{
    vector<int> v1,v2,v3;
    for (int i=0; i <= 10; i++)
    {
        v1.push_back(i);
    }
    for (int i = 12; i <= 30; i++)
    {
        v2.push_back(i);
    }
    v3.resi***(v1.size(), v2.size()));
    //迭代器指向最后一个元素的shang一个位置
    vector<int>::iterator myEnd=set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),v3.begin());
    for_each(v3.begin(),myEnd, print());
}
//求两个元素的并集
void test02()
{
    vector<int> v1, v2, v3;
    for (int i = 0; i <= 10; i++)
    {
        v1.push_back(i);
    }
    for (int i = 12; i <= 30; i++)
    {
        v2.push_back(i);
    }
    v3.resi***(v1.size(), v2.size()));
    //迭代器指向最后一个元素的shang一个位置
     
    vector<int>::iterator myEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    for_each(v3.begin(), v3.end(), print());
    for_each(v3.begin(), myEnd, print());
}
void print3(int v){
    cout << v << " ";
}
void test03()
{
    vector<int> v1, v2, v3;
    for (int i = 0; i <= 10; i++)
    {
        v1.push_back(i);
    }
    for (int i = 4; i <= 14; i++)
    {
        v2.push_back(i);
    }
    v3.resize(v1.size());
    //v3.resize(max(v1.size(), v2.size()));
    //迭代器指向最后一个元素的shang一个位置
 
    set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    for_each(v3.begin(), v3.end(), print3);
    cout << endl;
    vector<int>::iterator myEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    for_each(v3.begin(), myEnd, print3);
}
 
int main()
{
    //test02();
    test03();
    return EXIT_SUCCESS;
}

8、distace逆序算法
deque根据迭代器求数组下标distance()
两个迭代器之间的距离
迭代器本身是指针来用


#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
 
using namespace std;
 
class print{
public:
    void operator()(int v){
        cout << v << " ";
    }
};
 
//distance
void test01()
{
    vector<int> v;
    for (int i=0; i <= 10; i++)
    {
        v.push_back(i);
    }
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        int index = distance(v.begin(), it);
        cout << v[index]<<" ";
    }
     
}
 
//for_each修改容器元素的值
void print(int& v){
    v = v + 100;
}
 
void print2(const int& v)
{
    cout << v << " ";
}
void test02()
{
    vector<int> v;
    for (int i = 0; i <= 10; i++)
    {
        v.push_back(i);
    }
    for_each(v.begin(), v.end(), print2);
    cout << endl;
    for_each(v.begin(), v.end(), print);
    cout << endl;
    for_each(v.begin(), v.end(), print2);
    cout << endl;
 
}
 
//for_each逆向遍历
void test03()
{
    vector<int> v;
    for (int i = 0; i <= 10; i++)
    {
        v.push_back(i);
    }
    for_each(v.begin(), v.end(), print2);
    cout << endl;
    for_each(v.rbegin(), v.rend(), print2);
    cout << endl;
    //for_each(v.rbegin(), v.rend(), print2);
}
int main()
{
    //test02();
    test03();
    return EXIT_SUCCESS;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值