高效处理序列的必备利器
使用 ◀ ▶ 或底部按钮进行导航
对指定范围内的元素进行排序(默认升序)。不保证相等元素的相对顺序。
时间复杂度:平均 O(N log N)
对指定范围内的元素进行稳定排序。保证相等元素的原始相对顺序不变。
时间复杂度:通常 O(N log N),如果内存不足可能 O(N log² N)
在 **已排序** 的序列中快速检查某个元素是否存在。
时间复杂度:O(log N)
当前数组状态:
查找第一个 **不小于** (大于或等于) 指定值的元素,并返回其迭代器。
时间复杂度:O(log N)
查找第一个 **严格大于** 指定值的元素,并返回其迭代器。
时间复杂度:O(log N)
返回一个 `pair`,包含 `lower_bound` 和 `upper_bound` 的结果,即表示序列中所有等于指定值的元素的范围 `[first, last)`。
时间复杂度:O(log N)
当前数组状态:
将当前序列重排为字典序中的下一个排列。如果当前已是最大排列,则重排为最小排列(升序)并返回 `false`,否则返回 `true`。
时间复杂度:平均 O(N)
将当前序列重排为字典序中的上一个排列。如果当前已是最小排列,则重排为最大排列(降序)并返回 `false`,否则返回 `true`。
时间复杂度:平均 O(N)
当前排列:
反转指定范围内的元素顺序。
时间复杂度:O(N)
将序列中的元素进行循环左移,使得指定的 `middle` 元素成为新的第一个元素。
时间复杂度:O(N)
移除 **连续的** 重复元素(只保留第一个)。它并不实际删除元素,而是将不重复的元素移动到序列前端,并返回指向新的逻辑尾部的迭代器。通常需要配合容器的 `erase` 方法使用。
时间复杂度:O(N)
计算指定范围内元素的总和(或其他二元操作的结果)。需要提供初始值。
时间复杂度:O(N)
当前序列:
重新排列序列,使得索引为 `n` 的位置上的元素是 **如果整个序列排序后** 该位置应有的元素(即第 n 小的元素)。所有在 `n` 之前的元素都不大于它,所有在 `n` 之后的元素都不小于它。注意:除了第 n 个元素位置正确外,其他元素不保证有序。
时间复杂度:平均 O(N),最坏 O(N²)
对序列的一部分进行排序。它将序列中最小的 `k` (由 `middle` 迭代器指定) 个元素按升序排列放在序列的前 `k` 个位置。
时间复杂度:O(N log k)
根据指定的谓词(一个返回布尔值的函数或函数对象),重新排列序列,使得所有满足谓词的元素都排在所有不满足谓词的元素之前。返回指向第一个不满足谓词的元素的迭代器。
时间复杂度:O(N)
当前序列:
make_heap
: 将序列调整为最大堆(默认)。
push_heap
: 假设 `[first, last-1)` 已经是堆,将 `*(last-1)` 加入堆中。
pop_heap
: 将堆顶元素(最大值)移动到序列末尾 `*(last-1)`,并将剩余 `[first, last-1)` 调整为堆。需要手动 `pop_back()` (或其他方式) 移除末尾元素。
make_heap: O(N) | push/pop_heap: O(log N)
当前序列 (堆状态):
iota
(在 <numeric> 中): 用连续递增的值填充序列 (e.g., 0, 1, 2, ...)。
transform
: 对序列中的每个元素应用一个函数,并将结果存储到另一个序列(或原地修改)。
count / count_if
: 计算序列中等于某个值 / 满足某个谓词的元素数量。
min_element / max_element / minmax_element
: 返回指向序列中最小/最大/最小和最大元素的迭代器(或 pair)。
给定一个整数数组和整数 k,使用 `nth_element` 找到数组中第 k 大的元素,并输出数组中前 k 大的所有元素(这些元素本身不需要排序)。
给定一个整数数组和整数 k,分别使用堆操作(`make_heap`, `pop_heap`)和 `partial_sort` 找到数组中最小的 k 个元素,并按升序输出。思考两种方法在不同场景下的优劣。
C++20 引入了 `<ranges>` 库,提供了对算法的重大改进:
许多算法接受可选的最后一个参数,用于自定义比较逻辑 (Comparison function) 或条件判断 (Predicate function):
C++17 引入了执行策略,允许指定算法并行执行:
例如: `sort(execution::par, v.begin(), v.end());`
注意: 并行化并非总能带来性能提升,且需要注意数据竞争问题(自定义操作必须线程安全)。编译器和标准库的支持程度也可能不同。
C++ `<algorithm>` (及 `<numeric>`) 库提供了大量强大、高效且通用的函数,用于处理序列数据。
熟练掌握 `<algorithm>` 是 C++ 程序员提升效率和代码质量的关键一步。