C++泛型算法库中的常用算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winter_wu_1998/article/details/85261523
  • find算法

    • find(begin, end, val)
    • find_if(begin, end, func)
    • 一般用来搜索无序容器,**binary_search()**搜索有序容器
    • find() 返回首次出现的元素所在位置的迭代器,如果没找到返回 end()
    • 如果想要寻找的不是一个具体的值,而是满足某一规则的值,则应该选择find_if算法
    • find_end搜索最后一次出现的地点
    //避免重复查找
    while((iter = find(iter, vec.end(), val)) != vec.end()) {...}
    
  • sort算法

    • sort(begin, end [, func])
    • STL中的 sort算法在数据较小时采用插入排序,递归深度过高时采用堆排序,否则采用快排
      • 因为递归需要用到栈空间,而占空间大小有限,所以递归过深时会栈溢出
      • 数据大不一定递归深度大
    • sort算法能用于随机迭代器(比如vector的),而list,set等容器由于没有随机迭代器,不能对其使用sort
      • list有自己的sort方法
    • stable_sort提供稳定排序
  • equal算法

    • equal(begin1, end1, begin2 [,func])
    //由于假定两个序列长度相等,所以第二个序列只需传入开始迭代器
    bool euqal(begin1, end1, begin2); 
    
    //可以利用equal算法和逆序迭代器判断单词回文
    bool isPalindrome(const string& s)
    {
        return equal(s.begin(), s.end(), s.rbegin());
    }
    
  • max算法

    • max(val1, val2)
    • 两个比较的数据需要类型相同,比如unsigned int 和 int 无法比较,必须显式类型转换
  • accumulate算法

    • accumulate(begin, end, startVal [, func])
    • 可选参数func可以指定运算规则
    • 这个算法存在的缺陷是依赖startVal的类型,该类型作为其累加器的类型
      • 比如如果该类型是Int, 但是迭代器指向的值是double,则所有double类型的值都会被截断小数部分
    //product值为3268800 = 10!
    vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int product = accumulate(v.begin(), v.end(), multipiles<int>());
    
    // 连接一个vector<string>对象vec中的所有元素
    string t("");
    accumulate(vec.begin(), vec.end(), t);
    
  • transform算法

    • transform(begin, end, dest, rule)
    • 通过back_inserter(dest) 确保目的地有足够的空间保存输入
    • rule函数将应用到输入序列的每个元素松二获得输出序列
  • for_each算法

    • for_each(begin, end, func)
    • 对范围内的每个元素应用func运算,比如print
    • 此算法不可更改元素值,否则应该使用 transform算法
  • reverse算法

    • reverse(begin, end)
    //反转所有元素算法的实现代码
    template<typename It>
    void reverse(It begin, It end)
    {
        while(begin != end && begin != --end)
            swap(*begin++, end);
    }
    
  • copy算法

    • copy(begin, end, dest)
    • copy_if(begin, end dest, func)
    • 通过back_inserter(dest) 确保目的地有足够的空间保存输入
    • copy_if复制满足一定规则的元素
  • copy_backward算法

    • copy_bakcward(begin, end, dest_end)
    • 和copy算法不同之处在于copy给出目标开始地址,而该算法给出目标结束地址
    • 适用于只知道结束地址而不知道开始地址的情况
  • lexicographical_compare算法

    • lexicographical_compare(begin1, end1, begin2, end2 [, func])
    • 若第一个范围中对应位置的每个值都小于第二个,则返回true
  • partition算法

    • partition(begin, end, func)
    • func函数返回true则放在容器前面,false则放在后面
    • 返回值为第一个func返回false的元素的迭代器
    • stable_partition为稳定版本
  • remove算法

    • remove(begin, end, val)
    • remove_if(begin, end, func)
    • 不可用于关联容器
  • search算法

    • search(begin, end, sub_begin, sub_end [, func])
    • 如果存在子序列,返回子序列的第一个元素的迭代器,否则返回end()

拾遗

  • 许多改变容器内容的算法都提供两个版本,一个为 in-place 版本,一个为 copy版本
    • copy版本名称都有 _copy后缀,且多一个迭代器参数,指向目标容器头
  • 很多算法都有根据具体值判断和根据函数判断两个版本,后者名称都有 _if后缀

猜你喜欢

转载自blog.csdn.net/winter_wu_1998/article/details/85261523