STL学习笔记(六) 函数对象

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

仿函数都是 pass-by-valueless

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);spa

如今假设test函数是Widget的成员函数,即Widget支持自测:设计

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

若是咱们以下调用:指针

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

mem_fun:若是一个存放Widget*的指针容器,须要调用本身定义的成员函数时:code

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< 具备相同语义
相关文章
相关标签/搜索