zoukankan      html  css  js  c++  java
  • STL学习笔记(六) 函数对象

    条款38:遵循按值传递的原则来设计仿函数

    仿函数都是 pass-by-value

    Function for_each(InputIterator first, InputIterator last, Function f); //f按值传递, 结果按值返回

    函数对象按值传递和按值返回,所以函数对象要尽可能小(对象拷贝开销大)

    条款39:确保判别式是"纯函数"
    条款40:若一个类是仿函数,则应使它可配接
    条款41:理解ptr_fun、mem_fun、mem_fun_ref
    template<typename InputIterator, typename Function>
    Function for_each(InputIterator first, InputIterator last, Function f) {                                
        while (first != last)    f(*begin++);
    }

    一个函数f和一个对象x,如果在x对象调用f,则:
    f(x); //f是一个非成员函数
    x.f(); //f是成员函数,且x是一个对象或对象引用
    x->f(); //f是成员函数,且x是指向对象x的指针

    现在有一个用于测试Widget对象的非成员函数:
    bool test(Widget& widget);
    和一个存放Widget对象的容器: std::vector<Widget> vec;
    我们可以使用: for_each(vec.begin(), vec.end(), test);

    现在假设test函数是Widget的成员函数,即Widget支持自测:

    class Widget {
    public:
        void test();
    };

    如果我们如下调用:

    for_each(vec.begin, vec.end(), &Widget::test);    //编译错误!!! 

    mem_fun:如果一个存放Widget*的指针容器,需要调用自己定义的成员函数时:

    for_each(vecptr.begin(), vecptr.end(), mem_fun(&Widget::test));

    mem_fun_ref:如果一个存放Widget的容器,需要调用自己定义的成员函数时:

    for_each(vec.begin(), vec.end(), mem_fun_ref(&Widget::test));
    条款42:确保less<T>与 operator< 具有相同语义
  • 相关阅读:
    28、数组中出现次数超过一半的数字
    27、字符串的排列
    26、二叉搜索树与双向链表
    21、栈的压入、弹出序列
    22、从上往下打印二叉树
    23、二叉搜索树的后序遍历序列
    24、二叉树中和为某一值的路径
    25、复杂链表的复制
    4、简单工厂模式,工厂方法模式,
    基数排序
  • 原文地址:https://www.cnblogs.com/wwwjieo0/p/3444082.html
Copyright © 2011-2022 走看看