STL常用算法

概述

  • 算法主要是由头文件<algorithm>、<functional>、<numeric>组成
  • <algotirhm>是所有STL文件中最大的一个,涉及比较、交换、查找、遍历、复制、修改等
  • <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数
  • <functional>定义了一些模板类,用以声明函数对象

常用遍历算法

  • for_each(beg, end, func):遍历容器,beg、end为起始迭代器,func为函数或函数对象
  • transform(beg1, end1, beg2, func):搬运容器到另一个容器中

常用查找算法

  • find(beg, end, val):查找元素val,成功找到返回指定元素的迭代器,否则返回end()
    //自定义数据类型的查找
    class Person{
    public:
        Person(string name, int age){
            this.m_name = name;
            this.m_age = age;
        }
    
        //重载 == 让底层find知道如何对比Person数据类型
        //如果不加const,会被系统认为非法,目的是防止数据被修改
        bool operator==(const Person &p){
            if(this->m_name == p.m_name && this.m_age == p.m_age){
                return true;
            }else{
                retrun false;
            }
        }
    
        string m_name;
        int m_age;
    }
    //重载后,find知道如何对比,可正常使用
    //在v容器中寻找元素p
    vector<Person>::iteraor it == find(v.begin(), v.end(), p)
    
  • find_if(beg, end, _Pred):按条件查找元素,Pred为谓词或仿函数
    //自定义数据类型的按条件查找
    //谓词
    class Greater20{
    public:
        bool operator()(cosnt Person &p){
            return p.m_age > 20;
        }
    }
    //只需要将谓词传入find_if中
    vector<Person>::iterator it = find_if(v.bedin(), v.end(), Greater20());
  • adjacent_find(begin, end):查找相邻重复元素,返回相邻元素第一个位置的迭代器
  • binary_search(beg, end, val):二分查找法,只能用于有序序列
  • count(beg, end, val):统计值为val的元素个数
  • count_if(beg, end, _Pred):按条件统计元素个数,_Pred为谓词

常用排序算法

  • sort(beg, end, _Pred):对容器内的元素进行排序,可选参数 _Pred 为谓词
  • random_shuffle(beg, end):洗牌,指定范围内的元素随机调整次序
  • merge(beg1, end1, beg2, end2, dest):有序容器元素合并,并存储到另一容器dest保持有序
  • reverge(beg, end):反转指定范围的元素

常用的拷贝和替换算法

  • copy(beg, end, dest):容器指定范围内的元素拷贝到另一容器dest中
  • replace(beg, end, oldvalue, newvalue):将容器范围内指定的旧元素修改为新元素
  • replace_if(beg, end, _Pred, newvalue):容器内指定范围满足条件的元素替换为新元素
  • swap(c1, c2):互换两个容器的元素

常用算术生成算法

  • 算术生成算法属于小型算法,使用时包含的头文件为<numeric>
  • accumulate(beg, end, val):计算容器元素累计总和,val为总和起始值,函数会返回累加总和
  • fill(beg, end, val):向容器中添加元素val

常用集合算法

  • set_intersection(beg1, end1, beg2, end2, dest):求两个有序容器的交集,返回交集中最后元素的迭代器
    vector<int> vTarget;
    //取较小容器的空间值,开辟新空间
    vTarget.resize(min(v1.size(),v2.size()));
    
    //返回目标容器的最后一个元素的迭代器地址
    vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), 
        v2.begin(), v2.end(), vTarget.begin());
    
    //如果参数二输入vTarget.end(),可能会输出很多0,这些0并不是交集中的元素
    for_each(vTarget.begin(), itEnd, myPrint());
  • set_union(beg1, end1, beg2, end2, dest):求两个有序容器的并集,返回并集中最后元素的迭代器
    vector<int> vTarget;
    //取容器空间值之和,开辟新空间
    vTarget.resize(v1.size() + v2.size());
    
    //返回目标容器的最后一个元素的迭代器地址
    vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), 
        v2.begin(), v2.end(), vTarget.begin());
    
    //如果参数二输入vTarget.end(),可能会输出很多0,这些0并不是并集中的元素
    for_each(vTarget.begin(), itEnd, myPrint());
  • set_difference(beg1, end1, beg2, end2, dest):求两个容器的差集,返回差集中最后元素的迭代器,需要注意的是差集区分先后顺序,调换容器前后位置可能会得到不同结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值