介绍 C++ 标准头文件 — <algorithm>
头文件
简介
C++ 的 <algorithm>
头文件提供了大量的算法函数,比如排序、搜索、数据处理等。这些算法大多数都是模板函数,提供了泛型编程的能力。
特征
-
输入:一个算法必须有零个或以上输入量。
-
输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
-
明确性:算法的描述必须无歧义,以保证实际运行结果是精确地符合要求或期望。
-
有限性:依据图灵的定义,一个算法是能够被任何图灵完全系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数。
-
可行性:算法中执行的任何计算步骤都可以在有限时间内完成
函数
名称 | 描述 |
---|---|
adjacent_find | 搜索相等或满足指定条件的两个相邻元素。 |
all_of | 当给定范围中的每个元素均满足条件时返回 true 。 |
any_of | 当指定元素范围中至少有一个元素满足条件时返回 true 。 |
binary_search | 测试已排序的范围中是否有等于指定值的元素,或在二元谓词指定的意义上与指定值等效的元素。 |
copy | 将一个源范围中的元素值分配到目标范围,循环访问元素的源序列并将它们分配在一个向前方向的新位置。 |
copy_backward | 将一个源范围中的元素值分配到目标范围,循环访问元素的源序列并将它们分配在一个向后方向的新位置。 |
copy_if | 复制给定范围中对于指定条件为 true 的所有元素。 |
`copy_n | 复制指定数量的元素。 |
`count | 返回范围中其值与指定值匹配的元素的数量。 |
count_if | 返回范围中其值与指定条件匹配的元素的数量。 |
equal | 逐个元素比较两个范围是否相等或是否在二元谓词指定的意义上等效。 |
equal_range | 在排序的范围中查找符合以下条件的位置对:第一个位置小于或等效于指定元素的位置,第二个位置大于此元素位置,等效意义或用于在序列中建立位置的排序可通过二元谓词指定。 |
fill | 将相同的新值分配给指定范围中的每个元素。 |
fill_n | 将新值分配给以特定元素开始的范围中的指定数量的元素。 |
find | 在范围中找到具有指定值的元素的第一个匹配项位置。 |
find_end | 在范围中查找与指定序列相同的最后一个序列,或在二元谓词指定的意义上等效的最后一个序列。 |
find_first_of | 在目标范围中搜索若干值中任意值的第一个匹配项,或搜索在二元谓词指定的意义上等效于指定元素集的若干元素中任意元素的第一个匹配项。 |
find_if | 在范围中找到满足指定条件的元素的第一个匹配项位置。 |
find_if_not | 返回指示的范围中不满足条件的第一个元素。 |
for_each | 将指定的函数对象按向前顺序应用于范围中的每个元素并返回此函数对象。 |
generate | 将函数对象生成的值分配给范围中的每个元素。 |
generate_n | 将函数对象生成的值分配给范围中指定数量的元素,并返回到超出最后一个分配值的下一位置。 |
includes | 测试一个排序的范围是否包含另一排序范围中的所有元素,其中元素之间的排序或等效条件可通过二元谓词指定。 |
inplace_merge | 将两个连续的排序范围中的元素合并为一个排序范围,其中排序条件可通过二元谓词指定。 |
is_heap | 如果指定范围中的元素形成堆,则返回 true 。 |
is_heap_until | 如果指定范围形成直到最后一个元素的堆,则返回 true 。 |
is_partitioned | 如果给定范围中对某个条件测试为 true 的所有元素在测试为 true 的所有元素之前,则返回 false 。 |
is_permutation | 确定给定范围的元素是否形成有效排列。 |
is_sorted | 如果指定范围中的元素按顺序排序,则返回 true 。 |
is_sorted_until | 如果指定范围中的元素按顺序排序,则返回 true 。 |
iter_swap | 交换由一对指定迭代器引用的两个值。 |
lexicographical_compare | 逐个元素比较两个序列以确定其中的较小序列。 |
lower_bound | 在排序的范围中查找其值大于或等效于指定值的第一个元素的位置,其中排序条件可通过二元谓词指定。 |
make_heap | 将指定范围中的元素转换到第一个元素是最大元素的堆中,其中排序条件可通过二元谓词指定。 |
max | 比较两个对象并返回较大对象,其中排序条件可通过二元谓词指定。 |
max_element | 在指定范围中查找最大元素的第一个匹配项,其中排序条件可通过二元谓词指定。 |
merge | 将两个排序的源范围中的所有元素合并为一个排序的目标范围,其中排序条件可通过二元谓词指定。 |
min | 比较两个对象并返回较小对象,其中排序条件可通过二元谓词指定。 |
min_element | 在指定范围中查找最小元素的第一个匹配项,其中排序条件可通过二元谓词指定。 |
minmax | 比较两个输入参数,并按最小到最大的顺序将它们作为参数对返回。 |
minmax_element | 在一次调用中执行由 min_element 和 max_element 执行的操作。 |
mismatch | 逐个元素比较两个范围是否相等或是否在二元谓词指定的意义上等效,并找到出现不同的第一个位置。 |
move | 移动与指定范围关联的元素。 |
move_backward | 将一个迭代器的元素移动到另一迭代器。 移动从指定范围的最后一个元素开始,并在此范围的第一个元素结束。 |
next_permutation | 重新排序范围中的元素,以便使用按字典顺序的下一个更大排列(如果有)替换原有排序,其中“下一个”的意义可通过二元谓词指定。 |
none_of | 当给定范围中没有元素满足条件时返回 true 。 |
nth_element | 对范围内的元素分区,正确找到范围中序列的第 n n n 个元素,以使序列中位于此元素之前的所有元素小于或等于此元素,位于此元素之后的所有元素大于或等于此元素。 |
partial_sort | 将范围中指定数量的较小元素按非降序顺序排列,或根据二元谓词指定的排序条件排列。 |
partial_sort_copy | 将源范围中的元素复制到目标范围,其中源元素按降序或二元谓词指定的其他顺序排序。 |
partition | 将范围中的元素分为两个不相交的集,满足一元谓词的元素在不满足一元谓词的元素之前。 |
partition_copy | 将条件为 true 的元素复制到一个目标,将条件为 false 的元素复制到另一目标。 元素必须来自于指定范围。 |
partition_point | 返回给定范围中不满足条件的第一个元素。 元素经过排序,满足条件的元素在不满足条件的元素之前。 |
pop_heap | 移除从堆顶到范围中倒数第二个位置之间的最大元素,然后将剩余元素形成新堆。 |
prev_permutation | 重新排序范围中的元素,以便使用按字典顺序的下一个更大排列(如果有)替换原有排序,其中“下一个”的意义可通过二元谓词指定。 |
push_heap | 将范围末尾的元素添加到包括范围中前面元素的现有堆中。 |
random_shuffle | 将范围中 N N N 个元素的序列重新排序为随机 N ! N! N! 种序列中的 可能排列之一。 |
remove | 从给定范围中消除指定值,而不影响剩余元素的顺序,并返回不包含指定值的新范围的末尾。 |
remove_copy | 将源范围中的元素复制到目标范围(不复制具有指定值的元素),而不影响剩余元素的顺序,并返回新目标范围的末尾。 |
remove_copy_if | 将源范围中的元素复制到目标范围(不复制满足谓词的元素),而不影响剩余元素的顺序,并返回新目标范围的末尾。 |
remove_if | 从给定范围中消除满足谓词的元素,而不影响剩余元素的顺序,并返回不包含指定值的新范围的末尾。 |
replace | 检查范围中的每个元素,并替换与指定值匹配的元素。 |
replace_copy | 检查源范围中的每个元素,并替换与指定值匹配的元素,同时将结果复制到新的目标范围。 |
replace_copy_if | 检查源范围中的每个元素,并替换满足指定谓词的元素,同时将结果复制到新的目标范围。 |
replace_if | 检查范围中的每个元素,并替换满足指定谓词的元素。 |
reverse | 反转范围中元素的顺序。 |
reverse_copy | 反转源范围中元素的顺序,同时将这些元素复制到目标范围 |
rotate | 交换两个相邻范围中的元素。 |
rotate_copy | 交换源范围中两个相邻范围内的元素,并将结果复制到目标范围。 |
search | 在目标范围中搜索其元素与给定序列中的元素相等或在二元谓词指定的意义上等效于给定序列中的元素的序列的第一个匹配项。 |
search_n | 在范围中搜索具有特定值或按二元谓词的指定与此值相关的指定数量的元素。 |
set_difference | 将属于一个排序的源范围、但不属于另一排序的源范围的所有元素相并到一个排序的目标范围,其中排序条件可通过二元谓词指定。 |
set_intersection | 将属于两个排序的源范围的所有元素相并为一个排序的目标范围,其中排序条件可通过二元谓词指定。 |
set_symmetric_difference | 将属于一个而不是两个排序的源范围的所有元素相并为一个排序的目标范围,其中排序条件可通过二元谓词指定。 |
set_union | 将至少属于两个排序的源范围之一的所有元素相并为一个排序的目标范围,其中排序条件可通过二元谓词指定。 |
sort | 将指定范围中的元素按非降序顺序排列,或根据二元谓词指定的排序条件排列。 |
shuffle | 使用随机数生成器重新排列给定范围中的元素。 |
sort_heap | 将堆转换为排序的范围。 |
stable_partition | 将范围中的元素分为两个不相交的集,满足一元谓词的元素在不满足一元谓词的元素之前,并保留等效元素的相对顺序。 |
stable_sort | 将指定范围中的元素按非降序顺序排列,或根据二元谓词指定的排序条件排列,并保留等效元素的相对顺序。 |
swap | 在两种类型的对象之间交换元素值,将第一个对象的内容分配给第二个对象,将第二个对象的内容分配给第一个对象。 |
swap_ranges | 将一个范围中的元素与另一大小相等的范围中的元素交换。 |
transform | 将指定的函数对象应用于源范围中的每个元素或两个源范围中的元素对,并将函数对象的返回值复制到目标范围。 |
unique | 移除指定范围中彼此相邻的重复元素。 |
unique_copy | 将源范围中的元素复制到目标范围,彼此相邻的重复元素除外。 |
upper_bound | 在排序的范围中查找其值大于指定值的第一个元素的位置,其中排序条件可通过二元谓词指定。 |
源码
// <algorithm> -*- C++ -*-
// Copyright (C) 2001-2019 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// <http://www.gnu.org/licenses/>.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file include/algorithm
* This is a Standard C++ Library header.
*/
#ifndef _GLIBCXX_ALGORITHM
#define _GLIBCXX_ALGORITHM 1
#pragma GCC system_header
#include <utility> // UK-300.
#include <bits/stl_algobase.h>
#include <bits/stl_algo.h>
#if __cplusplus > 201402L
// Parallel STL algorithms
# if __PSTL_EXECUTION_POLICIES_DEFINED
// If <execution> has already been included, pull in implementations
# include <pstl/glue_algorithm_impl.h>
# else
// Otherwise just pull in forward declarations
# include <pstl/glue_algorithm_defs.h>
# define __PSTL_ALGORITHM_FORWARD_DECLARED 1
# endif
// Feature test macro for parallel algorithms
# define __cpp_lib_parallel_algorithm 201603L
#endif // C++17
#ifdef _GLIBCXX_PARALLEL
# include <parallel/algorithm>
#endif
#endif /* _GLIBCXX_ALGORITHM */
参考
-
https://learn.microsoft.com/zh-cn/cpp/standard-library/algorithm?view=msvc-170
-
https://baike.baidu.com/item/algorithm/1581833?fromModule=lemma_search-box
-
https://upimg.baike.so.com/doc/2758411-32334346.html
-
https://blog.csdn.net/Dan123_11111/article/details/138168629