MyTinySTL 简单分析(五)--memory.h heap_algo.h functional.h algo.h

发布时间:2024年01月19日

目前在学习STL,看到一个开源的项目MyTinySTL,非常不错。想着照着这个代码自己敲一遍应该也能有些进步。然后就开始了学习过程。

首先分析的是vector

以下是由vector.h关联的所有头文件

首先分析一下memory.h

该文件定义了两个类,temporary_buffer 和auto_ptr

auto_ptr实现了一个智能指针

temporary_buffer 定义了临时缓冲区的类模板,其中会使用malloc函数来分配空间

这个文件中还定义了一个函数

constexpr Tp* address_of(Tp& value) noexcept

这个函数能返回一个对象的地址,后面用的比较多

heap_algo.h

// 这个头文件包含?heap 的四个算法?: push_heap, pop_heap, sort_heap, make_heap,

//其中?sort_heap 函数接受两个迭代器,表示?heap 容器的首尾,不断执行?pop_heap 操作,直到首尾最多相差1

// 每执行一次?pop_heap,最大的元素都被放到尾部,直到容器最多只有一个元素,完成排序

functional.h

// 这个头文件包含了?mystl 的函数对象与哈希函数

函数对象就是定义了一个类(或结构体),其中重载了()操作符,则定义该类的对象后,对象后面加上括号,就可以表示一个函数,就会调用那个重载的函数。

定义了plus, minus, multiplies, devides, modules, negate,equal_to, not_qual_to,greater, less, greater_queal, less_equal, logic_and, logical_or, logical_not, 证同函数(返回原来的值) 等

另外定义了加法和乘法的证同元素?

这个是什么意思呢?

下面是文心一言上的解释

这段代码是C++模板函数,用于找到加法操作的单位元。单位元在数学中是一个特殊的元素,与任何其他元素相加都不会改变那个元素的值。对于加法来说,单位元通常被定义为0,因为任何数与0相加都等于它自己。

另外还定义了选择函数,投射函数,哈希函数

algo.h

这个文件包含了mystl的一系列算法,包括:

all_of

any_of

none_of

count

count_if

find

find_if

find_if_not

search

search_n

find_end

find_end_dispatch

为find_end服务的

find_first_of

for_each

对每个元素执行f操作

adjacent_find

找出第一对匹配的相邻元素

lower_bound

查找第一个不小于?value 的元素

lbound_dispatch

lower_bound

为lower_bound服务

upper_bound

中查找第一个大于value 的元素

ubound_dispatch

为upper_bound服务

binary_search

二分查找

equal_range

找出区间中与?value 相等的元素所形成的区间

erange_dispatch

equal_range服务

generate_n

用函数对象?gen 连续对?n 个元素赋值

includes

判断序列一S1 是否包含序列二S2

is_heap

检查[first, last)内的元素是否为一个堆

is_sorted

检查[first, last)内的元素是否升序

median

找出三个值的中间值

max_element

返回一个迭代器,

指向序列中最大的元素

min_elememt

返回一个迭代器,

指向序列中最小的元素

swap_ranges

[first1, last1)?first2 开始,交换相同个数元素

transform

调用某个操作处理每个元素

remove_copy

移除区间内与指定?value 相等的元素,并将结果复制到以?result 标示起始位置的容器上

remove

移除所有与指定?value 相等的元素

remove_copy_if

remove_if

移除区间内所有令一元操作?unary_pred ?true 的元素

replace_copy

replace_copy_if

replace_if

reverse

[first, last)区间内的元素反转

reverse_dispatch

为reverse服务

reverse_copy

行为与?reverse 类似,不同的是将结果复制到?result 所指容器中

random_shuffle

[first, last)内的元素次序随机重排

rotate

交换元素

rotate_dispatch

为rotate服务

rgcd

rotate_dispatch服务

rotate_copy

行为与?rotate 类似,不同的是将结果复制到?result 所指的容器中

is_permutation(组合)

判断[first1,last1)是否为[first2, last2)的排列组合

is_permutation_aux

is_permutation服务

next_permutation

取得[first, last)所标示序列的下一个排列组合,

prev_permutation

取得[first, last)所标示序列的上一个排列组合

merge

组合

merge_without_buffer

没有缓冲区的情况下合并

merge_backward

从后往前merge

rotate_adaptive

merge_adaptive

inplace_merge_aux

inplace_merge

merge_without_buffer

merge_backward

merge_adaptive

inplace_merge_aux

inplace_merge

partial_sort

psort_copy_aux

partial_sort_copy

partition

partition_copy

unchecked_partition

intro_sort

unchecked_linear_insert

unchecked_insertion_sort

insertion_sort

final_insertion_sort

sort

nth_element

对序列重排,

unique_copy_dispatch

unique_copy服务

unique_copy

unique

移除[first, last)内重复的元素,序列必须有序,

其中有很多函数有两个版本,一个是用默认的排序方式,另一个使用特定的Compare仿函数

文章来源:https://blog.csdn.net/gengxt2003/article/details/135689315
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。