第12章常用算法与algorithm库2025/6/171Lambda表达式;动态遍历算法;复制与替换算法;排序算法;查找算法;删除与清零算法;反转与旋转算法;全排列算法。
2025/6/172C++标准库中的algorithm算法库提供了丰富的算法,用于在各种容器(数据结构)上执行各种操作,除非特别情况(见12.4节),这些算法可以应用于std::list、std::vector、std::stack、std::deque、std::unordered_map、std::unordered_set、std::set等STL容器以及普通的数组。本章除非特别声明,后续提到的容器可以是STL容器的任何一个或普通的数组、提到的元素指容器中的节点(结点)。
12.1Lambda表达式2025/6/173algorithm算法库提供的许多函数(算法)开始支持C++11新增的Lambada表达式,这使得用户程序能更加容易地解决诸多实际问题。
2025/6/17412.1Lambda表达式1.Lambada表达式
2025/6/17512.1Lambda表达式1.Lambada表达式Lambada表达式的值就是函数的地址,不要混淆Lambada表达式的值和其匿名函数的返回值(如果有返回值的话)。Lambada表达式非常简明扼要,C++用“[]”标识一个Lambada表达式,例如:[](inta,intb){returna*b+100}。需要注意的是,Java语言使用“-”标识一个Lambada表达式,例如:(inta,intb)-{returna*b+100},Java允许省略Lambada表达式中的参数类型,例如:(a,b)-{returna*b+100},但C++不允许省略Lambada表达式中的参数类型。另外,C++允许在Lambada表达式的中括号[]里用逗号列出Lambada表达式要引用外部变量,例如引用Lambada表达式以外的变量x和y:[x,y](inta,intb){returna+b+x*y},这项功能要强于Java的Lambada表达式。
2025/6/17612.1Lambda表达式2.std::function模板类Lambada表达式的值是函数的地址,std::function类模板的实例可以存储Lambada表达式的值,这种灵活性使得程序可以将lambda表达式作为参数传递给其他函数。例如:std::functionint(int,int)func=[](inta,intb){returna+b;};那么intn=func(2,3);就相当于:intn=add(2,3);C++支持变量类型推断,可以用auto代替std::functionint(int,int),例如:automyFunc=[](inta,intb){returna+b;};那么intm=myFunc(12,10);就相当于:intm=add(12,10);
2025/6/17712.1Lambda表达式例1Lambada表达式的用法ch12_1.cppch12_1.cpp中给出了Lambada表达式的用法.
2025/6/17812.1Lambda表达式例2使用Lambada表达式实现动态排序ch12_2.cpp动态排序是指可以动态更改参与排序的数据的大小规则,这恰好适合使用Lambada表达式来做这样的事情,因为使用Lambada表达式可以把排序规则传递给排序的函数。ch12_2.cpp中的sort(intarr[],intsize,std::functionint(int,int)func)函数是起泡排序,可以动态地将一个Lambada表达式传递给类型是std::function的参数func,例如:sort(arr,12,[](inta,intb){returna*a-b*b});那么sort()方法在排序数组arr时,将按着Lambada表达式给出的大小规则(按平方大小)排序数组arr,
12.2动态遍历算法2025/6/179std::for_each(迭代器,op):该算法对容器的迭代器指向的每个元素执行指定操作op。使用std::for_each(迭代器,op)遍历容器时,可以根据需要将某个Lambada表达式传递给std::function型的参数op,该Lambada表达式只有一个参数,其类型和容