泛型算法概述

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

如果我们想要做:查找特定元素、替换或删除一个特定值、重排元素顺序等。标准库并未给每个容器都定义成员函数来实现这些操作,而是定义了一组泛型算法:称它们为“算法”,是因为它们实现了一些经典算法的公共接口,如排序和搜索;称它们是“泛型的”,是因为它们可用于不同类型的元素和多种容器类型(不仅包括标准库类型,如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用元素的==运算符完成每个元素与给定值的比较。其他算法可能要求元素类型支持<运算符。不过,我们将会看到,大多数算法提供了一种方法,允许我们使用自定义的操作来代替默认的运算符。

 

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

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

 

时间: 2024-08-03 19:48:10

泛型算法概述的相关文章

《IS-IS网络设计解决方案》一第6章 最短路径优先算法6.1 SPF算法概述

第6章 最短路径优先算法 IS-IS网络设计解决方案 路由选择协议的本质是收集网络环境中的路由选择信息,并选择到所有已知目的的最优路径.如第2章中提到的,在IS-IS协议的体系结构中,这些功能是由两个进程实现的:更新进程与决策进程.更新进程主要负责建立IS-IS数据库并维护其稳定性:决策进程使用最短路径优先(Shortest Path First,SPF)算法基于链路状态数据库中的信息计算到所有已知目的的最优路径.SPF算法通过计算区域内一个特定的节点到其他所有节点的最短路径树从而得出从这个特定

c++-泛型算法中find和binary_sreach有什么区别

问题描述 泛型算法中find和binary_sreach有什么区别 有序集合是不是只有升序和降序? binary_sreach使用的是什么搜索方式? 还有其他的搜索方式吗? 解决方案 一般C++有序集合就是升序或者降序的 binary_sreach就是二分法检索,经过一次比较就缩小一半的检索区间,所以效率比find高 解决方案二: 二分查找,每次都是取中间值比较,这样就可以确定查找值的范围.这个使用的前提就是已经排序过了.

《大数据算法》一2.1 时间亚线性算法概述

2.1 时间亚线性算法概述 本节我们通过两个简单的例子来介绍时间亚线性算法的基本概念. 2.1.1 平面图直径问题的亚线性算法 1.问题的定义 平面图直径问题 输入:有m个顶点的平面图(平面图可以放置在平面上而边不交叉),任意两点之间的距离存储在矩阵D中,即点i到点j的距离为Dij.输入满足如下条件: 1) 输入大小是D的大小n=m2. 2) 最大的Dij是图的直径. 3) 点之间的距离对称且满足三角不等式.距离对称意味着i到j的距离等于j到i的距离:满足三角不等式意味着对于i.j.k来说i到j

C++泛型算法的一些总结_C 语言

泛型算法的一些总结1.每个泛型算法的实现都独立于单独的容器,并且不依赖于容器存储的元素类型. 2.泛型算法从不直接添加或删除元素. 3.与容器的类型无关,只在一点上隐式地依赖元素类型:必须能够对元素做比较运算. A.需要某种遍历集合的方式:能够从一个元素向前移到下一个元素. B.必须能够知道是否到达了集合的末尾. C.必须能够对容器中的每一个元素与被查找的元素进行比较. D.需要一个类型来指示元素在容器中的位置,或者表示找不到该元素. 4.迭代器将算法和容器绑定起来.算法基于迭代器及其操作实现,

[C++ 面试基础知识总结] 泛型算法

[C++ 面试基础知识总结] 泛型算法 参考书籍:<C++ Primer> 目录 C 面试基础知识总结 泛型算法 目录 基础泛型算法 只读算法 写容器算法 重排容器元素算法 定制操作 向算法传递函数 lambda表达式 参数绑定 特殊迭代器 插入迭代器 iostream迭代器 反向迭代器 5类迭代器 链表的特定容器算法 基础泛型算法 泛型算法本身运行于迭代器之上,不会执行容器的操作,可以改变容器中保存元素的值,也可以在容器内移动元素,但永远不会直接添加或删除元素.插入迭代器是一种特殊的迭代器,

JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符

JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算是非常的痛苦吧,不过熬到现在,已经算是有点效果了,继续加油,估计三十来篇就能结束自己的JAVA之旅了,go,go! 一.泛型的概述 什么是泛型,我们可以用一个很典型的例子来说明 package com.lgl.hellojava; import java.util.ArrayList; import

Lanczos算法概述

Lanczos Algorithm: Lanczos算法就是被设计用来做特征分解的,和其他类似的算法一样,获得的奇异向量都是很接近的(这里的翻译可能不对,immediate翻译为很快?和其他类似算法一样,获得奇异向量很快?这样翻译?).矩阵A的奇异向量就是A^t * A 或者 A * A^t的特征向量.(这里A^t应该是矩阵A的转置么?特征向量应该是只有N*N的矩阵才有的,只有A的转置乘以A才能达到矩阵A是一个N*N的正方矩阵,这里A^t没搞懂是什么意思).Lanczos算法使用一个种子向量v(

强连通分支算法概述

深度优先搜索有一种经典的应用:把一个有向图分解为各强连通分支.很多有关有向图的算法都是从这种步骤开始的.(算法导论P338,觉得简洁而精妙,分享下) STRONGLY-CONNECTED-COMPONENTS(G) 1 call DFS(G) to compute finishing times f[u] for each vertex u 2 compute GT 3 call DFS(GT). but in the main loop of DFS, consider the vertice

[推荐系统]推荐系统的常用算法概述

前一阵子准备毕业论文的开题,一直在看推荐系统相关的论文.对推荐系统有了一个更加清晰和理性的认识,也对推荐算法有了深入了解.借此机会总结分享一下,大家多多拍砖. 推荐系统的出现 随着互联网的发展,人们正处于一个信息爆炸的时代.相比于过去的信息匮乏,面对现阶段海量的信息数据,对信息的筛选和过滤成为了衡量一个系统好坏的重要指标.一个具有良好用户体验的系统,会将海量信息进行筛选.过滤,将用户最关注最感兴趣的信息展现在用户面前.这大大增加了系统工作的效率,也节省了用户筛选信息的时间. 搜索引擎的出现在一定