简单谈谈C++ 头文件系列之(algorithm)

 更新时间:2020年4月25日 17:32  点击:1411

简介

algorithm头文件是C++的标准算法库,它主要应用在容器上。 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性。 因此,任何数据结构都能使用这套算法库,只要它具有相应的迭代器类型。

算法类别

如上图所示,库中的算法主要分为4类:

  1. 非修改性顺序操作(Non-modifying sequence operations)
  2. 可变顺序操作(Mutating sequence operations)
  3. 排序和关系操作(Sorting and related operations)
  4. C库算法(C library algorithms)

用过这个算法库的人都知道,里面的很多算法都是成对出现的,一个概念的算法经常有多个版本:

  • in-place version: 普通版本,直接操作对迭代器进行操作。
  • copying version: 拷贝版本,需要传入输出迭代器作为拷贝的destination。 该版本一般带有copy字样。
  • predicate version: 谓词版本,需要传入谓词作为判断的标准。 该版本一般带有if字样。

Non-modifying sequence operations

  • all_of : 判断是否范围内的所有元素都满足条件。
  • any_of : 判断是否范围内的所有元素中有一个满足条件。
  • none_of : 判断是否范围内的所有元素中没有一个满足条件。
  • for_each : 对指定范围内的每一个元素进行指定的操作。
  • find、find_if、find_if_not : 在指定范围中查找满足某个条件(值相等、条件满足、条件不满足)的元素。
  • find_end : 在指定序列中查找最后一个相等(或满足谓词条件)子序列。
  • find_first_of : 在指定序列中查找第一个出现在另一个序列中(或满足谓词条件)的元素。
  • adjacent_find : 在指定序列中查找第一个相等(值相等、满足条件)的元素对(2个元素)。
  • count、count_if : 对制定序列中的满足条件(值相等、满足条件)的元素进行计数。
  • mismatch : 给定两个元素序列,返回第一个不匹配(值不相等、不满足条件)的元素位置,以一个迭代器对指出。
  • equal : 判断两个序列是否相等(值相等、满足谓词条件)。
  • is_permutation : 判断是否一个序列是另一个序列的排列,即只有排列方式不相等(值不相等、不满足谓词条件)。
  • search、search_n : 在给定序列中查找子序列或者n个重复的元素序列。

Mutating sequence operations

  • copy、copy_n、copy_if、copy_backward : 拷贝序列、拷贝序列中前n个元素、拷贝序列中满足条件的、从后往前拷贝序列。
  • move、move_backward : 移动序列、从后往前移动序列(移动后,任然可以对源序列进行操作,但元素值是未指定的)。
  • swap、iter_swap : 逐元素交换序列、交换两个序列。
  • transform : 对一个 序列进行变换并输出、对两个序列进行变换并输出(变换通过自定义谓词来实现)。
  • replace、replace_if、replace_copy、replace_copy_if : 替换满足条件(值相等、满足谓词条件)的元素为给定元素、替换满足条件的元素并将其拷贝至别处。
  • fill、fill_n : 将给定序列元素填充为给定值、 将给定的前n个元素填充为给定值。
  • generate、generate_n : 用自定义的生成器生成元素,并将这些元素赋值给给定序列或前n个序列。
  • remove、remove_if : 移除相等或满足谓词条件的元素。 注意,若有元素被移除,指向这些元素之后的迭代器的可以使用,但结果是未指定的(unspecified)。
  • unique、unique_copy : 使序列唯一(即若有重复元素,保留第一个,其余全部移除)、是序列唯一并拷贝至目的地。
  • reverse、reverse_copy : 将给定序列逆转、将给定序列逆转并拷贝至目的地。
  • rotate、rotate_copy : 将给定序列左旋转(middle - first)个元素、将给定序列左旋转(middle - first)个元素并拷贝。
  • shuffle : 使用均匀随机数生成器将给定序列洗牌(即打乱,重新分布)。

下面几个函数有关分区的同一方面,但又功能却不想上面所列那么相似,故而分开叙述:

  • is_partition : 用给定的一元谓词判断给定序列是否被正确分区(即前一部分元素调用谓词返回true,后一部分返回false)。
  • partition : 对给定序列进行分区操作。
  • stable_partition : 与partition操作相似,但是两个group(即分区成的两个分区)内元素的相关顺序保持不变(stable)。
  • partition_copy : 与partition相似,但是两个分区group结果被拷贝到两个指定的位置。
  • partition_point : 返回分区点,该点之前、该点之后(包括该点)分别为两个分区。

Sorting and related operations

这些函数都有两个版本:使用operator < 的、使用函数子Compare的。

  • sort : 排序。
  • stable_sort : 稳定排序。
  • partial_sort : 部分排序,对于给定的序列,只排序前middle - first个元素,并将它们放置在[first, middle)范围中,剩余位置的元素顺序为指定。
  • partial_sort_copy : paartial_sort函数的copy版本。
  • is_sorted、is_sorted_util : 判断给定序列是否为已排序(使用operator < 或 自定义函数子判断)的。
  • nth_element : 将nth迭代器指定的位置排序为结果元素。(实际上应该是使用快排实现的)
  • lower_bound、upper_bound、equal_range : 返回下界、上界、相等性范围。
  • binary_search : 在给定序列中对元素进行二分查找。
  • merge、inplace_merge : 合并两个序列并输出。
  • includes : 判断是否一个序列重的所有元素都被包含在另一个序列中。
  • set_union : 并集。
  • set_intersection : 交集。
  • set_difference : 差集。
  • set_symmetric_difference : 对称差集。
  • push_heap : 将一个元素push进由序列表示的heap中,并维持堆得性质。
  • pop_heap : 将一个元素从heap中pop(实际上被交换到尾部)。
  • make_heap : 将给定序列构造成heap。
  • sort_heap : 对给定堆进行排序(可能有特殊的算法对堆排序进行优化)。
  • is_heap、is_heap_util : 判断给定序列是否为堆、判断给定序列到哪个位置之前为堆。
  • min、max : 返回最小值、最大值。
  • minmax : 返回pair
  • min_element、max_element : 返回序列中第一个最小值、最大值。
  • minmax_element : 返回pair
  • lexicographical_compare : 对两个序列进行字典序排序。
  • next_permutation、prev_permutation : 判断给定序列是否存在下一个或者上一个组合(所有可能的排列组合先由字典序排序,再进行判断)。

C library algorithms

该头文件还包含了标准C头文件stdlib.h,大体相同。 只是出于与C兼容的目的,bsearchqsort同时包含了C和C++的两个函数签名。

[!--infotagslink--]

相关文章

  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • C++ pair的用法实例详解

    这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
  • C++随机点名生成器实例代码(老师们的福音!)

    这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++如何删除map容器中指定值的元素详解

    map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
  • C++ 约瑟夫环问题案例详解

    这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 基于C++中常见编译错误的总结详解

    本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • C++实现递归函数的方法

    在本篇内容里小编给大家分享了关于C++实现递归函数的教学步骤,需要的朋友跟着参考下。...2020-04-25