栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++学习笔记(Day17 函数适配器 算法)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++学习笔记(Day17 函数适配器 算法)

函数适配器
  • 绑定适配器:bind1st、bind2nd

    • 将n元函数对象的指定参数绑定为一个常数,得到n-1元函数对象

  • 组合适配器:not1、not2

    • 将指定谓词的结果取反

  • 函数指针适配器:ptr_fun

    • 将一般函数指针转换为函数对象,使之能够作为其它函数适配器的输入。

    • 在进行参数绑定或其他转换的时候,通常需要函数对象的类型信息,例如bind1st和bind2nd要求函数对象必须继承于binary_function类型。但如果传入的是函数指针形式的函数对象,则无法获得函数对象的类型信息。

  • 成员函数适配器:ptrfun、ptrfun_ref

    • 对成员函数指针使用,把n元成员函数适配为n + 1元函数对象,该函数对象的第一个参数为调用该成员函数时的目的对象

    • 也就是需要将“object->method()”转为“method(object)”形式。将“object->method(arg1)”转为二元函数“method(object, arg1)”。

绑定适配器
  • binder2nd的实例构造通常比较冗长,bind2nd函数用于辅助构造binder2nd,产生它的一个实例。

  • binder1st和bind1st,将一个具体值绑定到二元函数的第一个参数。

例10-17:函数适配器实例——找到数组中第一个大于40的元素
//10_17.cpp
#include 
#include
#include
#include
using namespace std;

int main() {
    int intArr[] = { 30, 90, 10, 40, 70, 50, 20, 80 };
    const int N = sizeof(intArr) / sizeof(int);
    vector a(intArr, intArr + N);
    vector::iterator p = find_if(a.begin(), a.end(), bind2nd(greater(), 40));
    if (p == a.end())
        cout << "no element greater than 40" << endl;
    else
        cout << "first element greater than 40 is: " << *p << endl;
    return 0;
}

注:
find_if算法在STL中的原型声明为:
template
InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred);
它的功能是查找数组[first, last)区间中第一个pred(x)为真的元素。
算法 STL算法特点
  • STL算法本身是一种函数模版

    • 通过迭代器获得输入数据

    • 通过函数对象对数据进行处理

    • 通过迭代器将结果输出

  • STL算法是通用的,独立于具体的数据类型、容器类型

STL算法分类
  • 不可变序列算法

  • 可变序列算法

  • 排序和搜索算法

  • 数值算法

不可变序列算法
  • 不直接修改所操作的容器内容的算法

  • 用于查找指定元素、比较两个序列是否相等、对元素进行计数等

  • 例:

    template
    InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred);

    查找[first, last)区间内pred(x)为真的首个元素

可变序列算法
  • 可以修改它们所操作的容器对象

  • 包括对序列进行复制、删除、替换、倒序、旋转、交换、分割、去重、填充、洗牌的算法及生成一个序列的算法

  • 例:

    template
    InputIterator find_if(ForwardIterator first, ForwardIterator last, const T& x);

    将[first, last)区间内的元素全部改写为x。

排序和搜索算法
  • 对序列进行排序

  • 对两有序序列进行合并

  • 对有序序列进行搜索

  • 有序序列的集合操作

  • 堆算法

  • 例:

    template 
    void sort(RandomAccessIterator first, RandomAccessIterator last, UnaryPredicate comp);

    以函数对象comp为“<”,对 [first, last)区间内的数据进行排序

数值算法
  • 求序列中元素的“和”、部分“和”、相邻元素的“差”或两序列的内积

  • 求“和”的“+”、求“差”的“-”以及求内积的“+”和“·”都可由函数对象指定

  • 例:

    template
    OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryFunction op);

    对[first, last)内的元素求部分“和”(所谓部分“和”,是一个长度与输入序列相同的序列,其第n项为输入序列前n个元素的“和”),以函数对象op为“+”运算符,结果通过result输出,返回的迭代器指向输出序列最后一个元素的下一个元素

算法应用举例
  • 例10-20——例10-23演示了几类算法的应用。

  • 详见教材第10章

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352804.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号