目前在学习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仿函数