第三节 · 瑞士军刀 · 泛型算法

标准库不仅提供了容器,还提供了一套强大的算法。这些算法可以作用于几乎任何容器,就像一把瑞士军刀,一套工具解决多种问题。


算法的基本使用

算法定义在 <algorithm> 头文件中,通过迭代器操作容器:

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int> v = {5, 2, 8, 1, 9, 3, 7};
    
    // 排序
    sort(v.begin(), v.end());
    // v: 1, 2, 3, 5, 7, 8, 9
    
    // 查找
    auto it = find(v.begin(), v.end(), 5);
    if (it != v.end())
        cout << "找到 5,位置: " << (it - v.begin()) << endl;
    
    // 反转
    reverse(v.begin(), v.end());
    // v: 9, 8, 7, 5, 3, 2, 1
    
    return 0;
}

只读算法

这些算法不修改容器内容:


修改算法

这些算法会修改容器或输出容器:


排序算法


二分查找算法

用于已排序的序列:


最值算法


排列算法


自定义比较函数

大多数算法都支持自定义比较:


习题

  • 使用算法找出数组中第二大的元素。

  • 使用算法统计字符串中各字符出现的次数。

  • 使用 next_permutation 生成字符串的所有排列。

Last updated