概述

C++ 标准库的查找与统计算法基于输入迭代器,能在任意容器上执行线性搜索和条件判断。从简单的 find(等值查找)到 find_if(谓词查找),再到 all_of/any_of/none_of 的全量条件判断,覆盖了日常数据检索的大部分场景。

所有算法都是 O(n) 线性复杂度,对无序数据使用。

核心组件

查找

组件说明
find查找第一个等于目标值的元素
find_if查找第一个满足谓词的元素
find_if_not查找第一个不满足谓词的元素
find_first_of查找第一个属于给定集合的元素
adjacent_find查找第一对相邻相等的元素
search查找子序列首次出现位置
find_end查找子序列末次出现位置

统计与判断

组件说明
count统计等于目标值的元素个数
count_if统计满足谓词的元素个数
all_of所有元素是否都满足谓词
any_of是否存在满足谓词的元素
none_of所有元素是否都不满足谓词

典型用法

查找

FUNCTION demo_find:
    v = [10, 20, 30, 40, 50]

    it = FIND(v, 30)
    IF it != v.END() THEN PRINT *it         // 30

    it = FIND(v, 99)
    IF it == v.END() THEN PRINT "not found"

    it = FIND_IF(v, LAMBDA(x): RETURN x > 25)
    PRINT *it                               // 30(第一个 >25 的元素)

    it = ADJACENT_FIND([1, 2, 3, 3, 4])    // 指向第二个 3

统计

FUNCTION demo_count:
    v = [1, 2, 3, 2, 4, 2, 5]

    PRINT COUNT(v, 2)                       // 3

    PRINT COUNT_IF(v, LAMBDA(x):
        RETURN x % 2 == 0                   // 偶数个数
    )                                       // 4

批量判断

FUNCTION demo_all_any_none:
    v = [10, 20, 30, 40]

    PRINT ALL_OF(v, LAMBDA(x):
        RETURN x > 0                        // 全是正数?
    )                                       // true

    PRINT ANY_OF(v, LAMBDA(x):
        RETURN x > 35                       // 存在 >35 的?
    )                                       // true

    PRINT NONE_OF(v, LAMBDA(x):
        RETURN x < 0                        // 全不是负数?
    )                                       // true

  • 二分搜索: search — 有序数据用二分查找
  • 修改算法: modifyreplace/remove/copy
  • 函数式: lambda — lambda 作为谓词
  • Ranges: C++20 rangesFILTER 流水线替代 find_if + count_if
  • 返回目录: