• 第十六章 string类和标准模板库(4.标准模板库之函数对象和算法)


    函数对象

    很多STL算法都使用函数对象( for_each()、sort() )——也叫函数符(functor)。

    包括函数名、指向函数的指针和重载了运算符'()'的类对象。

    STL定义的函数符概念:

    ~生成器(generator):不用参数就可以调用的函数符;

    ~一元函数(unary function):用一个参数就可以调用的函数符(比如提供给for_each()的函数符);

    ~二元函数(binary function):用两个参数可以调用的函数符;

    ~谓词(predicate):返回bool值的一元函数;

    list模板有一个将谓词作为参数的remove_if()成员,将谓词应用于区间中的每一个元素,若为真则删除。

    ~二元谓词(binary predictor):返回bool值的二元函数(比如提供给sort()的函数符)。

    预定义的函数符

    头文件functional定义了多个模板类函数:

    自适应函数符和函数适配器:

    自适应函数符携带了标识参数类型和返回类型的typedef成员(这些成员分别是result_type、first_arguement_type、second_arguement_type)。

    函数符自适应的意义在于:函数适配器对象可以使用这些对象,并认为存在这些typedef成员。

    STL使用binder1st和bind2nd类,自动将自适应二元函数转换为自适应一元函数。例:

    binder1st(f2, val) f1;

    f1(x); //相当于f2(val, x)

    算法

    STL包含很多处理容器的非成员函数:

    sort()、copy()、find()、for_each()、replace()、random_shuffe()、set_union()、set_intersection()、set_difference()、transform()。

    STL将算法库分为4种:

    ~非修改式序列操作;

    ~修改式序列操作;

    ~排序和相关操作;

    ~通用数字运算符(计算两个容器的内部乘积、计算相邻对相差等数组操作特性)。

    前三组在头文件algorithm中描述;第四组在头文件numeric中描述。

    copy()

    copy(cast, cast+10, dice.begin()); //cast为数组名,dice为容器对象

    要求dice有足够的空间,如果dice没有足够的空间,可以使用插入迭代器,将复制转为插入。

    copy( cast, cast+10, insert_interator< vector<int> >(dice, dice.begin()) ) 

    for_each()

    一元函数遍历容器中的元素。

    transform()

    ~使用接受一个参数的函数:transform( gr8.begin(), gr8.end(), out, sqrt ); //gr8为一种容器对象,out为使用cout输出流的输出迭代器对象,sqrt为一元函数符

    ~使用接受两个参数的函数:transform( gr8.begin(), gr8.end(), m8.begin, out, add); //gr8和m8为一种容器对象,out为使用cout输出流的输出迭代器对象,add为二元函数符

    replace() / replace_copy() / replace_if()

    ~就地版本:replace(); //接收四个参数,迭代器区间、老值和新值

    ~复制版本:replace_copy(); //接收五个参数,迭代器区间,输出迭代器,老值和新值

    ~使用谓词的变体:replace_if(); //接收四个参数,迭代器区间,谓词,新值

    random_shuffle()

    接收两个参数(迭代器区间),随机排列该区间的元素。

    sort()

    ~一种版本接收两个参数(迭代器区间),如果容器元素是用户定义的对象,要使用sort(),则必须定义operator<()函数。

    ~另一种版本接收三个参数,第三个参数为谓词。

     next_permutation()

    将区间内容自动转化成另一种排列方式,如果成功则返回true,如果区间已处于最后的序列中则返回false。

    find()

  • 相关阅读:
    【转】Yii的url美化管理
    【转】通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件
    【转】关于C execlp函数的理解
    【转】shell循环,判断介绍,以及实例
    【转】Yii framework config 可以被配置的项目
    高级着色语言HLSL入门(7)
    c++中的string用法
    关于链表的创建 代码
    c++笔试题汇总
    TCP Socket编程 C/C++实现 (Windows Platform SDK)
  • 原文地址:https://www.cnblogs.com/sungnox/p/7705556.html
Copyright © 2020-2023  润新知