泛型算法概述

简介: 顺序容器只定义了很少的操作:在多数情况下,我们可以添加和删除元素。访问首尾元素、确定容器是否为空以及获得指向首元素或尾元素之后位置的迭代器。 如果我们想要做:查找特定元素、替换或删除一个特定值、重排元素顺序等。

顺序容器只定义了很少的操作:在多数情况下,我们可以添加和删除元素。访问首尾元素、确定容器是否为空以及获得指向首元素或尾元素之后位置的迭代器。

如果我们想要做:查找特定元素、替换或删除一个特定值、重排元素顺序等。标准库并未给每个容器都定义成员函数来实现这些操作,而是定义了一组泛型算法:称它们为“算法”,是因为它们实现了一些经典算法的公共接口,如排序和搜索;称它们是“泛型的”,是因为它们可用于不同类型的元素和多种容器类型(不仅包括标准库类型,如vector或list,还包括内置的数组类型)。

 

概述

大多数算法都定义在头文件algorithm中。标准库还在头文件numeric中定义了一组数值泛型算法。

一般情况下,这些算法并不直接操作容器,而是遍历由两个迭代器指定的一个元素范围来进行操作。通常情况下,算法遍历范围,对其中每个元素进行一些处理。例如,假定我们有一个int的vector,希望指定vector中是否包含一个特定值。回答这个问题最方便的方法是调用标准库算法find:

int val=42;

auto result=find(vec.cbegin(),vec.cend(),val);

传递给find的前两个参数是表示元素范围的迭代器,第三个参数是一个值。find将范围中每个元素与给定值进行比较。它返回指向第一个等于给定值的元素的迭代器。如果范围中无匹配元素,则find返回第二个参数来表示搜索失败。因此,我们可以通过比较返回值和第二个参数来判断搜索是否成功。

由于find操作的是迭代器,因此我们可以用同样的find函数在任何容器中查找值。例如,可以用find在一个string的list中查找一个给定值:

string val="a value";

auto result=find(lst.cbegin(),lst.cend(),val);

类似的,由于指针就像内置数组上的迭代器一样,我们可以用find在数组中查找值:

int ia[]={27,210,12,47,109,83};

int val=83;

int *result=find(begin(ia),end(ia),val);

此例中我们使用了标准库begin和end函数来获得指向ia中首元素和尾元素之后的指针,并传递给find。

还可以在序列的子范围中查找,只需要指向子范围首元素和尾元素之后位置的迭代器(指针)传递给find。例如,下面的语句在ia[1],ia[2]和ia[3]中查找指定的元素:

auto result=find(ia+1,ia+4;val);

 

算法如何工作

为了弄清这些算法如何用于不同类型的容器,让我们来观察一下find。find的工作是在一个未排序的元素序列中查找一个特定的元素。概念上,find应该执行如下步骤:

1 访问序列中的首元素

2 比较此元素与我们要查找的值

3 如果此元素与我们要查找的值匹配,find返回标识此元素的值。

4 否则,find前进到下一个元素,重复执行步骤2和3

5 如果到达序列尾,find应停止

6 如果find到达序列尾,它应该返回一个指出元素未找到的值。此值和步骤3返回的值必须具有相容的类型。

这些步骤都不依赖于容器所保存的元素类型。因此,只要有一个迭代器可用来访问元素,find就完全不依赖于容器类型(甚至无须理会保存元素的是不是容器)。

 

迭代器令算法不依赖于容器,但算法依赖于元素类型的操作

虽然迭代器的使用令算法不依赖于容器类型。但大多数算法都使用了一个(或多个)元素类型上的操作。例如,在步骤2中,find用元素的==运算符完成每个元素与给定值的比较。其他算法可能要求元素类型支持<运算符。不过,我们将会看到,大多数算法提供了一种方法,允许我们使用自定义的操作来代替默认的运算符。

 

注意:算法永远不会执行容器的操作

泛型算法本身不会执行容器的操作,它们只会运行与迭代器之上,执行迭代器的操作。泛型算法运行于迭代器之上而不会执行容器操作的特性带来了一个令人惊讶但非常必要的编程假定:算法永远不会改变底层容器的大小。算法可能改变容器中保存的元素的值,也可能在容器内移动元素,但永远不会直接添加或删除元素。

 

相关文章
|
算法 机器人 定位技术
第10章 经典智能算法——10.3 蚁群算法概述(2)
第10章 经典智能算法——10.3 蚁群算法概述(2)
|
机器学习/深度学习 设计模式 自然语言处理
【算法分析与设计】算法概述
【算法分析与设计】算法概述
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
人工智能 自然语言处理 算法
【人工智能】TF-IDF算法概述
TF-IDF算法,全称Term Frequency-Inverse Document Frequency(词频-逆文档频率),是一种在信息检索和文本挖掘领域广泛应用的加权技术。它通过评估一个词语在文档中的重要程度,来挖掘文章中的关键词,进而用于文本分析、搜索引擎优化等场景。其核心思想是:如果某个词或短语在一篇文章中出现的频率高(TF高),且在其他文章中很少出现(IDF也高),则认为这个词或短语具有很好的类别区分能力,适合用来代表这篇文章的内容。 具体而言,TF-IDF由两部分组成,即词频(TF)和逆文档频率(IDF)。词频(TF)指的是某一个给定的词在该文件中出现的频率。这个数值通常会被归一化
2024 3
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
1417 2
|
机器学习/深度学习 人工智能 算法
计算机算法基础概述与常用算法解析
计算机算法基础概述与常用算法解析
|
机器学习/深度学习 人工智能 算法
计算机算法基础概述与常用算法解析
计算机算法基础概述与常用算法解析
|
存储 算法 安全
加密算法概述:分类与常见算法
加密算法概述:分类与常见算法
|
负载均衡 算法 调度
负载均衡算法概述
负载均衡算法概述

热门文章

最新文章