`
strong_fee
  • 浏览: 178740 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

算法和函数对象(函数符)

阅读更多

函数对象就是一个类,但它和回调函数一样可以被回调。

1   可以与()联合使用的形式有:函数名、指向函数的指针和重载了()操作符的对象。

2   for_each()  的原型为:

         template<class InputIterator, class Function>

         Function for_each(InputIterator, InputIterator last, Function f);

         对于应用中的函数f可申明为:    void ShowView(const Review &);//即将(void *)(const Review&)赋值给模板参数Function 的类型。

         Function参数可表示具有重载的()操作符的类类型。

3   函数符的概念:

         生成器:不用参数就可以调用的函数符。

         一元函数:有一个参数可以调用。二元函数同理。

         断言:返回bool值的一元函数。

         二元断言:返回bool值的二元函数。

         将断言作为参数举例:

                   bool tooBig(int n){return n>100;}

                   list<int> scores;            scores.remove_if(tooBig);

                   将函数对象作为remove_if()的参数:

                   template<class T>

                   class TooBig{

                   private:       T cutoff;

                   public:        TooBig(const T &t):cutoff(t){}

                                      bool operator(const T & v){return v>cutoff;}

                   };

                   void main(){

                            TooBig<int> f100(100);

list<int> ya;

int val[10]={20,50,100,…};

ya.insert(ya.begin(), val, val+10);

ya.remove_if(f100);

ya.remove_if(TooBig<int>(200));

}

4.      模板类函数对象:

         用法如:

         plus<double> add;        double y=add(2.2, 3.2);

         transform(gr.begin(), gr.end(), m.begin(), out, plus<double>());

         操作符和相应的函数符:                              

操作符

相应的函数

操作符

相应的函数

+

plus

greater

-

minus

less

*

multiplies

>=

greater_equal

/

divides

<=

less_equal

%

modulus

&&

logical_and

-

negate

||

logical_or

==

equal_to

!

logical_not

!=

not_equal_to

 

 

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

         绑定函数:

         绑定器函数对象(被绑定函数对象必须为双目函数)

STL 中的帮定器有:

         bind1st() 创建一个函数对象,该函数对象将值V作为第一个参数A

         bind2nd()创建一个函数对象,该函数对象将值V作为第二个参数B

         用法举例:

         count_if(aList.begin(), aList.end(),bind1st(greater<int>(), 8), k);//计算所有小于或等于8的对象的数目,k为个数的应用,如果没有该参数,则返回在值为个数。

         否定函数对象:就是它从另一个函数对象创建而来,如果原先的函数返回真,则否定函数对象返回假。

         自适应函数:携带了参数类型和返回值类型的typedef成员,这些成员分别是result_type   first_argument_typesecond_augument_type.

将二元函数变成一元函数的方法binder1stbinder2nd的用法):

binder1st的对象将自适应函数的第一个参数的特定值相关联;binder2nd的对象将自适应函数的第二个参数的特定值相关联。

f2()是一个带两个参数的自适应函数

binder1st(f2, val) f1; 返回的值与将val作为第一个参数、将f1()的参数作为第二个参数的f2()相同,f(x)等价于f2(val, x);

STL提供bind1st以简化binder1st类的使用:

bind1st(multiplies<double>(), 2.5);          binder2ndbind2nd用法同理。

7.      否定函数对象:就是它从另一个函数对象创建而来,如果原先的函数返回真,则否定函数对象返回假。       有两个否定函数对象:not1()not2()not1()接受单目函数对象,not2()接受双目函数对象。否定函数对象通常和绑定器一起使用。

         用法如:

         start = find_if(aList.begin(), aList.end(), not1(bind1nd(greater<int>(), 8)));//计算q>8,必须使用not1,因为bind1nd返回单目函数。

     算法

(1)     算法组:

         1)      非修改式序列操作(头文件algorithm,前algo.h)

                            对区间中的每个元素进行操作,不改变容器的内容。

         2)      修改式序列操作(头文件algorithm,前algo.h)

可以修改容器中的内容,可以修改值,也可以修改值的排列顺序,如transform()random_shuffle()copy()

         3)      排序和相关操作(头文件algorithm,前algo.h)

                           包括多个排序函数(如sort())和其他各种函数,如集合操作。

         4)      通用数字运算(头文件numeric,前algol.h)

(2)     常用算法:

         1)      transform:将迭代区间中的值改变后存入另一个迭代器中。其有两种形式:

                  1.1 transform()接受四个参数:

         前两个参数是指定容器区间的迭代器,第三个参数是接受复制结果的迭代器,最后一个参数是一个一元函数符(),被用于区间中的每个元素,生成结果中的新元素。用法如:

               cout int LIM=5;

               double arr[LIM]={25,23,55,23,64};

               vector<double> gr(arr, arr+LIM);

               ostream_iterator<double, char> out (cout, “”);

               transform(gr.begin(), gr..end(), out, sqrt);

                   1.2    transform()接受五个参数的函数,并将该函数用于两个区间中元素,用第三个参数标识两个参数的起始位置。用法如:

                   m是一个vector<double>的对象,mean(double, double)返回两个值的平均值。

                   transform(gr.begin(), gr.end(), m.begin(), out, mean);

                   set<string> wordset;

                   transform(words.begin(), words.end(),   

                            insert_itereator<set<string>>(wordset, wordset.begin()), ToLower))

2copy:将一个迭代区间中的值赋值给另一个迭代区间

         函数原型:

         template<class InputIterator, class OutputIterator>

         OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);

         用法如:

ostream_itereator<string, char>out(cout, “ ”);//有的编译器为ostream_iterator<int> out(cout, “ ”);

         copy(c.begin(), c.end(), out); //将元素拷贝到输出流

(3)     replace:在迭代区间中,用新值代替旧值。用两种形式:

         3.1    replace的就地版本原型(四个参数)结果被存放在原始数据的位置。

                  template<class ForwardIterator, Class T>

                  void replace(ForwardIterator first, ForwardIterator last, const T& old_value,

                           const T&    new_value);

         3.2    replace的复制版本原型(五个参数)结果被发送到另一个位置。

         template<class InputIterator, class OutputIterator, Class T>

void replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value,     const T& new_value);

用法举例:

                    vector<int> V;
                    V.push_back(1);
                    V.push_back(2);
                    V.push_back(3);
                    V.push_back(1);
                    replace(V.begin(), V.end(), 1, 99);

(4)       replace_if:从区间中移除断言为真的元素。

         函数原形为:

void replace_if(ForwardIterator fist, ForwardIterator last, Predicate pred);

(5)    for_each():对于区间中的每个元素都进行f操作。

                   Function for_each(InputIterator, InputIterator last, Function f);

                   对于应用中的函数f可申明为:    void ShowView(const Review &);//即将(void *)(const Review&)             值给模板参数Function 的类型。Function参数可表示具有重载的()操作符的类类型。

(6)    accumulate() 算法(#include <numeric>):计算容器中所有值的总和。

         这样的值不一定是简单的类型,通过重载operator+(),也可以是类对象。

         两种函数原形:

         6.1    T accumulate(InputIterator first, InputIterator last, T init);// result = result + *i

         6.2    T accumulate(InputIterator first, InputIterator last, T init,

             BinaryFunction binary_op);// result = binary_op(result, *i)

         用法举例:

         vector<long> v(MAX);

         for (int i = 0; i < MAX; i++)

             v[i] = i + 1;

         long sum =accumulate(v.begin(), v.end(), 0);

           cout << "Sum of values == " << sum << endl;

         long product =accumulate(v.begin(), v.end(), 1, multiplies<long>());//注意这行

           cout << "Product of values == " << product << endl;

0
0
分享到:
评论

相关推荐

    代码 多种群遗传算法的函数优化算法代码

    代码 多种群遗传算法的函数优化算法代码代码 多种群遗传算法的函数优化算法代码代码 多种群遗传算法的函数优化算法代码代码 多种群遗传算法的函数优化算法代码代码 多种群遗传算法的函数优化算法代码代码 多种群遗传...

    优化算法测试函数MATLAB代码完整版

    这个“优化算法测试函数MATLAB代码完整版”压缩包提供了全面的资源,包括代码、数据以及算法的详细描述,旨在帮助用户理解和应用各种优化算法。 首先,MATLAB是一个强大的数学计算软件,广泛用于科学计算、图像处理...

    利用遗传算法求函数最小值-实例验证

    `Sheffield的遗传算法工具箱` 是一个专门用于实现遗传算法的MATLAB工具包,可能包含了各种遗传算法的基本操作函数和辅助工具。这个工具箱可能包括初始化种群、适应度函数计算、选择策略、交叉操作、变异操作以及终止...

    Rosenbrock函数_优化测试函数_优化算法测试函数_

    "Rosenbrock函数.txt" 和 "Rosenbrock函数" 这两个文件很可能包含了关于该函数的进一步讨论、实现代码示例或者优化算法的结果分析。通过深入阅读这些文件,我们可以获取更多关于如何求解和分析Rosenbrock函数的细节...

    遗传算法目标函数、适应度函数与遗传算法工具箱简介.pdf

    在遗传算法中,目标函数和适应度函数扮演着至关重要的角色。 目标函数(Objective Function)是遗传算法的核心,它定义了我们想要优化的问题。目标函数可以是寻找函数的最大值或最小值,例如在工程设计中的最小化...

    新实验五 人工智能之遗传算法求解函数最大值.rar

    本实验“新实验五 人工智能之遗传算法求解函数最大值”着重于如何利用遗传算法寻找给定函数的最大值。下面将详细解释遗传算法的基本原理、C#实现细节以及在Visual Studio中的应用。 1. **遗传算法概述** - 基本...

    testfunction.rar_matlab测试函数_智能优化_智能优化算法_测试函数MATLAB_算法 测试函数

    在IT领域,特别是优化算法的研究和开发中,测试函数扮演着至关重要的角色。"testfunction.rar" 是一个MATLAB编译的压缩包,包含了18个专门用于智能优化算法性能评估的测试函数程序。这些函数设计的目标是模拟复杂的...

    基于遗传算法的函数优化

    【基于遗传算法的函数优化】是一种利用生物进化原理来解决复杂优化问题的计算方法,它在计算机科学,尤其是机器学习和人工智能领域具有广泛的应用。MATLAB作为一种强大的数值计算和编程环境,是实现遗传算法的理想...

    算法测试基准函数

    在IT领域,尤其是在优化算法和人工智能的研究中,测试基准函数起着至关重要的作用。"算法测试基准函数"是一组专门设计用于评估和比较不同智能算法性能的数学模型。这些函数通常具有不同的特性,如多模态、非线性、...

    蚁群算法求函数最值

    在本项目中,"蚁群算法求函数最值"是利用蚁群算法在MATLAB编程环境中寻找一个数学函数的最小值或最大值。 MATLAB是一种广泛应用于数值计算、矩阵运算、数据可视化和算法开发的高级编程环境。在这个项目中,MATLAB被...

    遗传算法优化测试函数,方便理解

    遗传算法优化测试函数,方便理解 ,简单通俗易懂 ,方便和其他算法对比 遗传算法优化测试函数,方便理解 ,简单通俗易懂 ,方便和其他算法对比 遗传算法优化测试函数,方便理解 ,简单通俗易懂 ,方便和其他算法对比...

    黏菌优化算法黏菌优化算法黏菌优化算法测试函数

    黏菌优化算法黏菌优化算法黏菌优化算法测试函数 黏菌优化算法黏菌优化算法黏菌优化算法测试函数 黏菌优化算法黏菌优化算法黏菌优化算法测试函数 黏菌优化算法黏菌优化算法黏菌优化算法测试函数 黏菌优化算法黏菌优化...

    Ackley函数_ackley函数_优化算法测试函数_

    Ackley函数,作为优化算法测试领域的一个重要工具,它的设计初衷是为了评估和比较不同优化算法在处理复杂优化问题时的能力。这个函数具有多模态、非线性、非凸等特性,使得它成为检验全局搜索性能的理想选择。下面将...

    遗传算法求解函数Matlab源程序

    本程序用于基础遗传算法求解函数,样例函数为二次函数,可以根据自身需求转换函数。

    优化算法测试函数.zip

    优化算法测试函数其中包括Rosenbrock.m,Schaffer.m,Schewel.m,Schwefel.m,shiftedRosenbrock.m,ShiftedSphere.m,Sphere.m,step.m,SumDifferent.m,SumSquares.m,Zakharov.m,rastrigin.m,sumpow.m,perm0...

    人工智能遗传算法求解函数的最大值问题

    通过学习和理解这些内容,我们可以深入掌握遗传算法如何处理函数最优化问题,并且能够将其应用到其他类型的函数或更广泛的优化问题中。此外,还可以研究如何改进遗传算法,比如采用多策略选择、动态调整参数、引入...

    粒子群优化算法求解函数最大值和最小值问题

    在解决函数的最大值和最小值问题时,PSO算法的基本步骤如下: 1. 初始化:首先,随机生成一定数量的粒子,它们代表解空间中的可能解,每个粒子的位置和速度被设定为随机值。 2. 计算适应度值:对于每一个粒子,...

    粒子群算法的测试函数:Griewank函数

    Griewank函数是常用的测试函数之一,用于评估和比较优化算法的性能。这个函数具有多个局部最小值,但只有一个全局最小值,位于原点(0,0,...,0),使得优化过程更具挑战性。Griewank函数的数学表达式为: \[ f(x) = \...

    遗传算法求解Rastrigin函数

    遗传算法求解Rastrigin函数遗传算法求解Rastrigin函数遗传算法求解Rastrigin函数遗传算法求解Rastrigin函数

Global site tag (gtag.js) - Google Analytics