|
|
|
@ -1,4 +1,8 @@
|
|
|
|
|
#ifndef MYTINYSTL_ALGO_H_
|
|
|
|
|
/*这个头文件 algo.h 是 mystl 命名空间中的算法库实现,包含了大量的常用算法,如查找、排序、合并、替换等。
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef MYTINYSTL_ALGO_H_
|
|
|
|
|
#define MYTINYSTL_ALGO_H_
|
|
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
@ -6,7 +10,9 @@
|
|
|
|
|
#pragma warning(disable : 4244)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// 这个头文件包含了 mystl 的一系列算法
|
|
|
|
|
// #ifndef MYTINYSTL_ALGO_H_ 和 #define MYTINYSTL_ALGO_H_ 是头文件保护,防止重复包含。
|
|
|
|
|
|
|
|
|
|
//#ifdef _MSC_VER 是 Microsoft Visual C++ 编译器的特定代码,#pragma warning(push) 和 #pragma warning(disable : 4244) 用于禁用特定的编译器警告(这里是 4244 警告,通常与类型转换相关)。
|
|
|
|
|
|
|
|
|
|
#include <cstddef>
|
|
|
|
|
#include <ctime>
|
|
|
|
@ -16,6 +22,10 @@
|
|
|
|
|
#include "heap_algo.h"
|
|
|
|
|
#include "functional.h"
|
|
|
|
|
|
|
|
|
|
//<cstddef> 和 <ctime> 是标准库头文件,分别用于定义 size_t 类型和时间相关函数。
|
|
|
|
|
|
|
|
|
|
//"algobase.h"、"memory.h"、"heap_algo.h"、"functional.h" 是 mystl 内部的头文件,分别提供了基础算法、内存管理、堆算法和函数对象相关的功能。
|
|
|
|
|
|
|
|
|
|
namespace mystl
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
@ -2726,6 +2736,85 @@ ForwardIter unique(ForwardIter first, ForwardIter last)
|
|
|
|
|
return mystl::unique_copy(first, last, first);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//4. 算法实现
|
|
|
|
|
/*接下来的代码实现了大量的算法,每个算法都有详细的注释。以下是一些关键算法的简要说明:
|
|
|
|
|
|
|
|
|
|
4.1 all_of、any_of、none_of
|
|
|
|
|
这些算法用于检查区间内的元素是否满足某个条件。
|
|
|
|
|
|
|
|
|
|
all_of 检查区间内所有元素是否都满足条件。
|
|
|
|
|
|
|
|
|
|
any_of 检查区间内是否存在至少一个元素满足条件。
|
|
|
|
|
|
|
|
|
|
none_of 检查区间内是否没有任何元素满足条件。
|
|
|
|
|
|
|
|
|
|
4.2 count、count_if
|
|
|
|
|
count 统计区间内等于某个值的元素个数。
|
|
|
|
|
|
|
|
|
|
count_if 统计区间内满足某个条件的元素个数。
|
|
|
|
|
|
|
|
|
|
4.3 find、find_if、find_if_not
|
|
|
|
|
find 查找区间内等于某个值的元素。
|
|
|
|
|
|
|
|
|
|
find_if 查找区间内满足某个条件的元素。
|
|
|
|
|
|
|
|
|
|
find_if_not 查找区间内不满足某个条件的元素。
|
|
|
|
|
|
|
|
|
|
4.4 search、search_n
|
|
|
|
|
search 在第一个区间内查找第二个区间首次出现的位置。
|
|
|
|
|
|
|
|
|
|
search_n 在区间内查找连续 n 个等于某个值的元素。
|
|
|
|
|
|
|
|
|
|
4.5 lower_bound、upper_bound、binary_search
|
|
|
|
|
lower_bound 返回第一个不小于给定值的元素位置。
|
|
|
|
|
|
|
|
|
|
upper_bound 返回第一个大于给定值的元素位置。
|
|
|
|
|
|
|
|
|
|
binary_search 判断区间内是否存在等于给定值的元素。
|
|
|
|
|
|
|
|
|
|
4.6 sort、partial_sort、nth_element
|
|
|
|
|
sort 对区间内的元素进行排序。
|
|
|
|
|
|
|
|
|
|
partial_sort 对区间内的部分元素进行排序。
|
|
|
|
|
|
|
|
|
|
nth_element 对区间内的元素进行部分排序,使得第 n 个元素处于正确的位置。
|
|
|
|
|
|
|
|
|
|
4.7 merge、inplace_merge
|
|
|
|
|
merge 合并两个有序区间。
|
|
|
|
|
|
|
|
|
|
inplace_merge 在原地合并两个有序区间。
|
|
|
|
|
|
|
|
|
|
4.8 unique、unique_copy
|
|
|
|
|
unique 移除区间内相邻的重复元素。
|
|
|
|
|
|
|
|
|
|
unique_copy 将区间内的元素复制到另一个区间,并移除相邻的重复元素。
|
|
|
|
|
|
|
|
|
|
4.9 partition、partition_copy
|
|
|
|
|
partition 将区间内的元素根据某个条件分为两部分。
|
|
|
|
|
|
|
|
|
|
partition_copy 将区间内的元素根据某个条件复制到两个不同的区间。
|
|
|
|
|
|
|
|
|
|
4.10 reverse、reverse_copy
|
|
|
|
|
reverse 反转区间内的元素顺序。
|
|
|
|
|
|
|
|
|
|
reverse_copy 将区间内的元素反转后复制到另一个区间。
|
|
|
|
|
|
|
|
|
|
4.11 random_shuffle
|
|
|
|
|
random_shuffle 随机打乱区间内的元素顺序。
|
|
|
|
|
|
|
|
|
|
4.12 rotate、rotate_copy
|
|
|
|
|
rotate 旋转区间内的元素。
|
|
|
|
|
|
|
|
|
|
rotate_copy 将旋转后的区间复制到另一个区间。
|
|
|
|
|
|
|
|
|
|
4.13 is_permutation
|
|
|
|
|
is_permutation 判断两个区间是否为彼此的排列组合。
|
|
|
|
|
|
|
|
|
|
4.14 next_permutation、prev_permutation
|
|
|
|
|
next_permutation 将区间内的元素排列为下一个字典序排列。
|
|
|
|
|
|
|
|
|
|
prev_permutation 将区间内的元素排列为上一个字典序排列。
|
|
|
|
|
*/
|
|
|
|
|
// 重载版本使用函数对象 comp 代替比较操作
|
|
|
|
|
template <class ForwardIter, class Compared>
|
|
|
|
|
ForwardIter unique(ForwardIter first, ForwardIter last, Compared comp)
|
|
|
|
|