概念 | 参数数量 | 返回值类型 | 核心用途 | 典型算法依赖 |
---|---|---|---|---|
UnaryPredicate | 1 | bool | 单元素条件判断 | count_if、find_if、remove_if |
UnaryFunction | 1 | 任意类型 | 单元素转换、计算 | transform(一元版) |
BinaryPredicate | 2 | bool | 双元素关系判断 | sort、unique、merge |
BinaryFunction | 2 | 任意类型 | 双元素组合、计算 | transform(二元版)、inner_product |
Generator | 0 | 任意类型 | 无参数生成值 | generate、generate_n |
Procedure | 任意 | void | 执行副作用操作 | for_each |
下面的函数可以不用去刻意地记, 但是需要知道的是其函数求解的思路 , 本质就是灵活地运用for/while和if...else for循环中套if...else... if...else...中套for循环
for_each
count
cout_if
所有加了if的操作, 可以理解为一种选择, 比如上面就是选择性计数 需要自定义选择性函数
find, find_if, find_if_not
find_if选择性find find_if_not选择性不find
partition
// 模板函数:将范围 [first, last) 按谓词 p 分区——满足 p 的元素移到前半段,不满足的移到后半段
// 模板参数说明:
// ForwardIt:前向迭代器类型(支持 ++、解引用 *、iter_swap 操作,如 vector::iterator、list::iterator)
// UnaryPredicate:一元谓词类型(接收单个元素参数,返回 bool,true 表示元素属于前半段)
// 参数说明:
// first/last:待分区的左闭右开范围 [first, last),需提前确保迭代器合法
// p:分区谓词(判断元素是否应放在前半段)
// 返回值:指向“前半段(满足 p)末尾、后半段(不满足 p)开头”的迭代器(即第一个不满足 p 的元素位置)
template<class ForwardIt, class UnaryPredicate>
ForwardIt partition(ForwardIt first, ForwardIt last, UnaryPredicate p)
{
// 第一步:找到「第一个不满足谓词 p 的元素」,用 first 指向它
// 作用:前半段的“待交换位置”从这个元素开始(因为它之前的元素都已满足 p,无需处理)
// std::find_if_not:遍历 [first, last),返回第一个使 p 返回 false 的元素迭代器
first = std::find_if_not(first, last, p);
// 第二步:检查是否所有元素都满足 p(first 已指向 last,说明前半段就是整个范围)
// 若所有元素都满足 p,直接返回 first(即 last),无需后续分区
if (first == last) return first;
// 第三步:遍历剩余元素(从 first 的下一个元素开始,记为 i),执行分区核心逻辑
// i 是“当前待检查元素”的迭代器,遍历范围 [next(first), last)
for (ForwardIt i = std::next(first); i != last; ++i) {
// 核心判断:若当前元素 i 满足谓词 p(应属于前半段)
if (p(*i)) {
// 1. 交换 i 和 first 指向的元素:将满足 p 的元素 i 移到前半段的“待交换位置”first
// (此时 first 指向的是不满足 p 的元素,交换后该元素被移到 i 的位置,归入后半段)
std::iter_swap(i, first);
// 2. 将 first 向后移动一位:更新前半段的“待交换位置”(下一个不满足 p 的元素位置)
++first;
}
// 若当前元素 i 不满足 p,无需操作,直接进入下一轮遍历(i 自然归入后半段)
}
// 循环结束后,first 恰好指向“前半段末尾、后半段开头”,返回该迭代器作为分区边界
return first;
}
fill_n
lower_bound
当相等的时候选择左边部分
upper_bound
注意!(value < *it) 等价于 (*it <= value)
当相等的时候选择右边部分
equal_range
它的本质是调用上面的两个函数
copy, copy_if
transform
把字符串中的小写字母变成大写字母
merge
merge是要求是排好顺序的, 并且是升序排序
qsort
在C++标准库中,qsort
函数被用于对数组进行排序。当排序时,如果比较函数(comp
)指示两个元素相等,则这两个元素的相对顺序是不确定的。这意味着即使两个元素在逻辑上是等价的,qsort
不会保证它们在排序后的数组中的顺序。