C++ STL常用算法

算法主要头文件:

      <algorithm>  体积最大,涉及比较,交换,查找,遍历操作,复制,修改等  

      <numeric>    体积小,简单数据运算模板函数

      <functional> 定义模板类,声明函数对象

常用遍历算法

       for_each( iterator beg,iterator end,_func )         //遍历容器

       transform( iterator beg1,iterator end1,iterator beg2,_func )       //搬运容器到另一个容器中

#include<algorithm>
#include<vector>

class ToDo
{
   public:
   int operator(int v)
   {
      return v;
   }
}
toDo(){}

int main()
{
    vector<int> v;
    for(int i=0;i<10;i+)
        v.push_back(i);

    //for_each遍历
    for_each(v.begin(),v.end(),toDo);
    //for_each(v.begin(),v.end(),ToDo());    //ToDo为仿函数

    //transform搬运
    vector<int>  vTarget; //目标容器
    vTarget.resize(v.size());    //提前开辟空间
    transform(v.begin(),v.end(),vTarget.begin);
    //transform(v.begin(),v.end(),vTarget.begin,ToDo());     //ToDo为仿函数(逻辑运算)

    system("pause");
    return 0;
}

常用查找算法

      find( iterator beg,iterator end,value )                         //查找元素(返回 迭代器)找到一个即停止

      find_if( iterator beg,iterator end,_Pred )                     //按条件查找元素(返回 迭代器)找到一个即停止

      adjacent_find(  iterator beg,iterator end )                   //查找相邻重复元素(返回 [第一位置]迭代器)

      binary_search( iterator beg,iterator end,value )        //二分查找法 (仅有序序列,返回 bool)

      count( iterator beg,iterator end )                                //统计某元素个数(返回 个数)

      count_if( iterator beg,iterator end,_Pred )                 //按照条件统计元素个数

#include <vertor>
#include <algorithm>

class GreaterFive
{
 public:
    bool operator(int val)
    {
       return val > 5;
    }
}

int main()
{
    vertor<int> v;
    for(int i=0;i<10;i++)
        v.push_back(i);

    //find()
    vertor<int>:: it1 = find(v.begin,v.end(),5);
    if(it == v.end()){}   //未找到

    //find_if()
    vertor<int>:: it2 = find_if(v.begin,v.end(),GreaterFive());    //greater()内仿函数
    if(it == v.end()){}   //未找到

    vertor<int> v1;
    v1.push_back(4);
    v1.push_back(1);
    v1.push_back(3);    //返回位置
    v1.push_back(3);
    v1.push_back(2);
    //adjacent_find()
    vertor<int>:: it3 = adjacent_find(v1.begin,v1.end());  
    if(it == v.end()){}   //未找到

    //binary_search
    bool flag = binary_search(v.begin,v.end(),5);

    //count
    int num1 = count(v1.begin,v1.end(),3);

    //count_if
    int num2 = count_if(v.begin,v.end(),GreaterFive());

    system("pause");
    return;
}

常用排序算法

       sort( iterator beg,iterator end,_Pred                                                                     //对容器内元素排序

       random_shuffic( iterator beg,iterator end                                                           //洗牌,范围里随机调整位置

        merge( iterator beg1,iterator end1 ,iterator beg2,iterator end2 ,iterator dest       //容器元素合并,储存到另一容器(两容器必须有序)

        reverse( iterator beg,iterator end                                                                         //反转指定范围的元素

#include <vertor>
#include <algorithm>
#include <functional>

int main()
{
    vertor<int> v,v2;
    for(int i=0;i<10;i++)
        v.push_back(i);
    for(int i=10;i<30;i++)
        v2.push_back(i);

    //sort
    sort(v.begin,v.end());
    sort(v.begin,v.end(),greater<int>());    //降序

    //random_shuffic
    random_shuffic(v.begin,v.end());

    //merge
    vertor<int> newV;
    newV.resize(v.size()+v2.size());    //开辟空间
    merge(v.begin,v.end(),v2.begin,v2.end(),newV.begin())

    //reverse
    reverse(v.begin,v.end());

    system("pause");
    return 0;
}

常用拷贝和替代算法

    copy( iterator beg,iterator end ,iterator dest )                     //容器内指定范围的元素拷贝到另一个容器中

    replace( iterator beg,iterator end,oldValue,newValue )       //将容器内指定范围的旧元素修改为新元素

    replace_if( iterator beg,iterator end,_pred,newValue )       //容器内指定范围满足条件的元素替代为新元素

    swap( container c1, container c2 )                                     //互换两容器的元素

#include <vertor>
#include <algorithm>
#include <functional>

class Greater5
{
public:
    bool operator()(int val)
    {
        return val>5;
    }
}

int main()
{
    vertor<int> v,v2;
    for(int i=0;i<10;i++)
        v.push_back(i);
    for(int i=10;i<30;i++)
        v2.push_back(i);

    //copy
    vertor<int> tmpV;
    tmpV.resize(v.size());
    copy(v.begin,v.end(),tmpV.begin);    

    //replace
    replace(v.begin,v.end(),5,80);

    //replace_if
    replace_if(v.begin,v.end(),Greater5(),80);    //Greater5仿函数

    //swap
    swap(v,v2);

    system("pause");
    return 0;
}

常用算术生成算法

        accumulate( iterator beg,iterator end,value            //计算容器元素累计总和

       fill( iterator beg,iterator end,value )                             //向容器中添加元素

#include <vertor>
#include <numeric>


class Greater5
{
public:
    bool operator()(int val)
    {
        return val>5;
    }
}

int main()
{
    vertor<int> v;
    for(int i=0;i<10;i++)
        v.push_back(i);
    
    //accumulate
    int total = accumulate(v.begin(),v.end(),0); //0:初始累加值

    //fill
    vertor<int> tmpV;
    tmpV.resize(100);
    fill(tmpV.begin(),tmpV.end(),100);
    
    system("pause");
    return 0;
}

常用集合算法

      set_intersection( iterator beg1,iterator end1 ,iterator beg2,iterator end2,iterator dest  )               //求两容器的交集(有序序列,返回容器最后迭代器地址)

     set_union( iterator beg1,iterator end1 ,iterator beg2,iterator end2,iterator dest  )                          //求两容器的并集(有序序列,返回容器最后迭代器地址)

     set_difference( iterator beg1,iterator end1 ,iterator beg2,iterator end2,iterator dest  )                   //求两容器的差集(有序序列,返回容器最后迭代器地址)

#include <vertor>
#include <algorithm>

int main()
{
    vertor<int> v,v2;
    for(int i=0;i<10;i++)
        v.push_back(i);
    for(int i=5;i<30;i++)
        v2.push_back(i);
    
    //set_intersection
    vertor<int>  interV;
    interV.resize(min(v.size(),v2.size())); //最小空间
    vertor<int>::iterator itEndInter 
            = set_intersection(v.begin(),v.end(),v2.begin(),v2.end(),interV.begin()); 

    //set_union
    vertor<int>  unionV;
    unionV.resize(v.size()+v2.size());    //特殊状况空间
    vertor<int>::iterator itEndUnion 
            = set_union(v.begin(),v.end(),v2.begin(),v2.end(),unionV.begin());

    //set_difference
    vertor<int>  diffV;
    diffV.resize(v.size()+v2.size());    //特殊状况空间
    vertor<int>::iterator itEndDiff 
            = set_difference(v.begin(),v.end(),v2.begin(),v2.end(),diffV.begin());
    
    system("pause");
    return 0;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BC菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值