Algorithms library
概念 | 参数数量 | 返回值类型 | 核心用途 | 典型算法依赖 |
---|---|---|---|---|
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_each
count
cout_if
find, find_if, find_if_not
fill_n
lower_bound
当相等的时候选择左边部分
upper_bound
注意!(value < *it) 等价于 (*it <= value)
当相等的时候选择右边部分
equal_range
它的本质是调用上面的两个函数
copy, copy_if
merge
merge是要求是排好顺序的, 并且是升序排序
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;
}
qsort
在C++标准库中,qsort
函数被用于对数组进行排序。当排序时,如果比较函数(comp
)指示两个元素相等,则这两个元素的相对顺序是不确定的。这意味着即使两个元素在逻辑上是等价的,qsort
不会保证它们在排序后的数组中的顺序。