zoukankan      html  css  js  c++  java
  • Effective_STL 学习笔记(四十六) 考虑使用函数对象代替函数做算法的参数

    STL 函数对象——化妆成函数的对象——传递给算法所产生的代码比一般传递真的函数高效

    假设需要以降序排序一个 double 的 vector,最直接的 STL 方式是通过 sort 算法和 greater<double> 类型的函数对象:

    1   vector<double> v;
    2   . . .
    3   sort( v.begin(), v.end(), greater<double>() );

    避开函数对象而使用真的函数,一个真的内联函数:

    1   inline bool doubleGreater(double d1, double d2)
    2   {
    3     return d1 > d2;
    4   }
    5   . . .
    6   sort( v.begin(), v.end(), doubleGreater );

    其中,greater<double>::operator() 是一个内联函数,编译器实例化 sort 时内联展开它,结果 sort 没有包含一次函数调用

    对于使用 doubleGreater 调用的 sort 的情况不同。在函数传递时,不可能把一个函数作为参数传给另一个函数,编译器默认把函数转换为指向那个函数的指针:

    1   sort( v.begin(), v.end(), doubleGreater ); // 传递了一个 doubleGreater 指针

    每次在 sort 调用时,编译器产生一个间接函数调用——通过函数指针调用

    把函数对象作为算法的参数带来的不仅是巨大的效率提升。在让你的代码可以编译方面,它们更加稳健。当然真函数很有用,但当涉及有效的 STL 编程时,函数对象经常更有用。

  • 相关阅读:
    Vue.js-项目目录结构解析
    Vue.js-创建Vue项目(Vue项目初始化)并不是用Webstrom创建,只是用Webstrom打开
    Node.js-npm安装包目录修改
    Node.js-Webstorm2018配置nodejs
    Node.js-ReferenceError: _filename is not defined
    cas系列-自定义异常提示(五)
    cas系列-cas登出(四)
    cas系列-cas REST协议(三)
    maven引入第三方jar包
    持续api管理翻译
  • 原文地址:https://www.cnblogs.com/kidycharon/p/10055235.html
Copyright © 2011-2022 走看看