回到首页 / 上级目录

算法

算法库(algorithm)可配合容器使用,下面介绍常用的一些算法。

不修改序列的操作

对一个任意的 vector 的操作:

num = count(v.begin(), v.end(), x); // 统计 x 的个数
if (find(v.begin(), v.end(), x) != v.end()); // 查找第一个 x

修改序列的操作

对一个任意的 vector 的操作:

rotate(v.begin(), v.begin() + 2, v.end()); // 翻转 
replace(v.begin(), v.end(), old, new); // 用 new 替换所有 old 
swap(x, y); // 交换值
unique(v.begin(), v.end()); // 删除相邻重复元素
reverse(v.begin(), v.end()); // 反转

分区操作

可采用 partition 函数为对指定范围的元素进行划分。

auto cmp = [*first](const auto& e) { return e < *first; };
auto mid = partition(first, last, cmp);

函数会返回一个正向迭代器,指向的是第二组数据中的第 1 个元素。

所有比 first 小的元素放在左边,否则放右边。

排序操作

if (is_sorted(v.begin(), v.end()) == false) {
    sort(v.begin(), v.end()); // 排序
}

二分查找

针对排好序的 vector 的操作:

bool result = binary_search(v.begin(), v.end(), x); // 查找是否包含 x
it = lower_bound(v.begin(), v.end(), x); // 不小于 x 的第一个元素
it = upper_bound(v.begin(), v.end(), x); // 大于 x 的第一个元素

对有序数组的操作

vector<int> v;
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v)); // 合并

集合操作

vector<int> v1 = {1, 2, 4};
vector<int> v2 = {2, 3};
if (includes(v1.begin(), v1.end(), v2.begin(), v2.end())) // v1 是否包含 v2
set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(v, v.begin())); // 差集
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(v, v.begin())); // 并集

堆操作

make_heap(v.begin(), v.end()); // 建立堆
if (is_heap(v.begin(), v.end())) // 判断是否为堆
v.push_back(x); // 将元素加入堆尾
push_heap(v.begin(), v.end()); // 结合上一步
pop_heap(v.begin(), v.end()); // 弹出最大元素
v.pop_back(); // 结合上一步
sort_heap(v.begin(), v.end()); // 将堆变成升序数组

最值

e = max(x, y);
e = min(x, y);
e = *max_element(v.begin(), v.end()); // 最大值
e = *min_element(v.begin(), v.end()); // 最小值

排列

is_permutation(v1.begin(), v1.end(), v2.begin()); // v2 是否为 v1 的排列
next_permutation(v.begin(), v.end()); // 下一个排列

求和

sum = accumulate(v.begin(), v.end()); // 求和

参考链接