C++泛型算法之向算法传递参数

时间:2014.05.17

地点:基地二楼

------------------------------------------------------------------------------

一、谓词

有些算法会对输入的序列元素进行比较运算,但具体使用何种,我们往往根据需求而变化,于是C++泛型编程中将这个需求抽象为算法的一个参数,该参数是一个谓词,谓词是一个可被调用的表达式,谓词的返回结果是一个能用作条件的值。标准库算法使用的谓词有一元谓词和二元谓词,这里的一元和二元表示该谓词只接受一个参数或者两个参数。接受谓词参数的算法会对输入序列中的元素调用这个谓词进行计算。举个例子来说,我们知道sort算法中默认使用<运算符对元素进行比较来排序,现在我们可定义一个谓词,告诉sort函数,用这个谓词来代替原来的<运算符来对元素进行比较,然后进行排序操作。

bool IsShorter(const string& s1, const string& s2)
{
	return s1.size() < s2.size();
}

以上部分我们定义了一个谓词,然后就可将该谓词传递给算法sort,sort就会用该算法代替之前的<运算符比较两个元素,也就是说,之前的排序我们是用默认的<运算对两个元素的大小进行比较后决定两个元素的次序的,现在我们用的谓词是通过比较两个元素的长度大小来决定两个元素的次序的,于是最终结果将是按元素长度进行排序,也就是说,我们通过一个自定义的谓词传递给算法,从而改变算法是如何对元素进行排序的行为的。

一个完整的测试例子如下:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
bool IsShorter(const string& s1, const string& s2)
{
	return s1.size() < s2.size();
}
int main()
{
	vector<string> words{ "turtle", "fox", "slow", "red", "the", "oveer", "quick" };
	sort(words.begin(), words.end(), IsShorter);
	for (const auto& s : words)
		cout << s << " ";
	return 0;
}

这里顺便介绍一个stable_sort()算法,它的用法和上面那个sort()算法一样,也接受一对迭代器和一个谓词,不过它排序是稳定排序,如过有要求将单词按长度进行排序,而相同长度的单词就按字典排序的话,可先用默认版的sort对单词进行排序,默认是字典排序,然后再用自定义谓词的stable_sort排序,即现在是按单词长度排序,如果长度相同,把持先有的单词次序相对位置不变,即原来的字典排序后相对位置。

------------------------------------------------------------------------------

二、练习

标准库中有一个partion算法,啊,快速排序中就要用到,我们可自己定义划分谓词将它传递给该算法,partion算法会根据该谓词对元素进行划分,使得谓词为true的值会排在容器前,使得谓词为false的值会排在容器后,而且还返回一个迭代器,指向最后一个使得谓词为true的元素之后的那个位置,先要求partion算法根据元素的大小将string划分为长度小于5和长度大于或等于5的两个部分,并打印出长度大于或等于5的string。这个实现如下:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool IsBigString(const string& str)
{
	return str.size() < 5;
}
int main()
{
	vector<string> words{ "This", "is", "my", "first", "string", "test", "example" };
	auto cursor_iter=partition(words.begin(), words.end(), IsBigString);
	for (auto it = cursor_iter; it != words.end(); ++it)
		cout << *it << " ";
	return 0;
}

看来掌握泛型算法真的很实用呀~

C++泛型算法之向算法传递参数

时间: 2024-10-13 16:32:46

C++泛型算法之向算法传递参数的相关文章

c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值,覆盖给定的范围的元素 fill_n 用给定值,覆盖给定开始位置后的,n个元素变 back_inserter 在容器末尾插入元素 copy 把容器1指定范围里的值拷贝给容器2,并返回指向容器2最后一个元素的下个元素 replace 用某个值替换掉给定范围的某个值 replace_copy 用某个值替

机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size

机器学习算法中如何选取超参数:学习速率.正则项系数.minibatch size 本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习算法中,如何选取初始的超参数的值.(本文会不断补充) 学习速率(learning rate,η) 运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率η.下面讨论在训练时选取η的策略. 固定的学习速率.如果学习速率太小,则会使收敛过慢,如果学习速率太大,则会导致代价

转:Web页面通过URL地址传递参数常见问题及检测方法

Web页面即我们在浏览器中所看到的网页,在Web应用程序中,其页面往往需要进行动态切换和数据交互,页面间的数据常规传递方法有多种,本文主要介绍Web页面处理程序中常见的URL地址参数传递方法,包括概述其实现原理.特点和常见问题,最后介绍检测该方式常见应用问题的测试思路和方法. 1.web页面的概念 Web是internet上一个非常重要的资源信息网,产生于20世纪90年代初,它遵循超文本传输协议,以超文本或超媒介的形式传送各种各样的信息,为用户提供了一个具有友好的图形化界面--Web页面,以便用

AES算法,DES算法,RSA算法JAVA实现

1     AES算法 1.1    算法描述 1.1.1      设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计简单. 当前的大多数分组密码,其轮函数是Feistel结构. Rijndael没有这种结构. Rijndael轮函数是由3个不同的可逆均匀变换 1.1.2      密码说明 严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大

条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了弄懂其中的内容查阅了很多资料,所以里面应该会有引用其他帖子的小部分内容,如果原作者看到可以私信我,我会将您的帖子的地址付到下面. 3,如果有内容错误或不准确欢迎大家指正. 4,如果能帮到你,那真是太好了. 学习方法 条件随机场模型实际上是定义在时序数据上的对数线性模型,其学习方法包括极大似然估计和正则化的极大

最小生成树(prim算法,Kruskal算法)c++实现

1.生成树的概念 连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树. 生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 2.最小生成树的性质用哲学的观点来说,每个事物都有自己特有的性质,那么图的最小生成树也是不例外的.按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点.n-1 条边. 3.构造最小生成树,要解决以下两个问题

行为识别笔记:improved dense trajectories算法(iDT算法)(转载)

iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法.由INRIA的IEAR实验室于2013年发表于ICCV.目前基于深度学习的行为识别算法效果已经超过了iDT算法,但与iDT的结果做ensemble总还是能获得一些提升.所以这几年好多论文的最优效果都是"Our method+iDT"的形式. 此前由于项目原因,对iDT算法进行了很多研究和实验,故此处对其核心思路与一些实施的细节进行总结,方便后续回顾,也希望能够在此过程中获得一些新的启发. 介绍的内

张正友标定算法理论及算法实现

张正友标定算法理论及算法实现 理论基础 1999年,微软研究院的张正友提出了基于移动平面模板的相机标定方法.此方法是介于传统标定方法和自标定方法之间的一种方法,传统标定方法虽然精度高设备有较高的要求,其操作过程也比较繁琐,自标定方法的精度不高,张正友标定算法克服了这两者的缺点同时又兼备二者的优点,因此对办公.家庭的场合使用的桌面视觉系统(DVS)很适合. 设三维世界中坐标的点为:和二维相机平面坐标的点为: 为方便运算,模板被定义在世界坐标系中与X-y平面平行(即Z=0)的平面上,为模板平面上点的

stl_algorithm算法之变动性算法和非动性算法

七.算法:(算法头文件:<algorithm>) 所有的算法都需要iterator的支持,列如支持++,*,op=,op==,等等.. 非变动性算法: 7.1.template<class InputIterator, class UnaryPredicate> bool all_of (InputIterator first, InputIterator last, UnaryPredicate pred) //要所有的数据都是符合当前的条件才回返回TRUE,否则FALSE. {