std::ranges::count需c++20、头文件,仅支持相等比较,不接受谓词;替代条件计数用count_if;支持所有可遍历范围,但无限视图需截断;性能与std::count一致,无额外开销。

std::ranges::count需要C++20且头文件不能只写
它不定义在 <algorithm></algorithm> 里,也不在 <functional></functional>,而是在 <ranges></ranges>。漏包含这个头文件会直接报错: error: 'count' is not a member of 'std::ranges'。另外,编译器必须支持 C++20(如 GCC 10+、Clang 10+、MSVC 19.28+),并启用 -std=c++20 或更高标准。
std::ranges::count只接受范围和值,不支持自定义谓词
和传统 std::count_if 不同,std::ranges::count 只做相等比较(内部用 operator==),不接受谓词函数或 lambda。想做条件计数?得换用 std::ranges::count_if。
- ✅ 正确:统计 vector 中等于 42 的元素个数 ——
std::ranges::count(v, 42) - ❌ 错误:试图传入 lambda ——
std::ranges::count(v, [](int x){ return x > 10; })编译失败 - ✅ 替代:改用
std::ranges::count_if(v, [](int x){ return x > 10; })
支持所有范围类型,但注意视图需可遍历
它可以处理容器(std::vector、std::array)、原始数组、字符串,也支持视图(std::views::filter、std::views::take 等),但前提是该视图能被遍历且满足 std::ranges::range 概念。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- ✅ 有效:对过滤后的子范围计数 ——
std::ranges::count(v | std::views::filter([](int x){ return x % 2 == 0; }), 0) - ⚠️ 注意:若视图是无限的(如
std::views::iota未截断),count会无限循环 - ✅ 安全写法:先用
std::views::take限定长度 ——auto r = std::views::iota(0) | std::views::take(100); std::ranges::count(r, 5)
性能与传统 std::count 基本一致,无额外开销
std::ranges::count 是纯算法适配器,底层仍逐个比较,时间复杂度 O(n),空间 O(1)。它不会自动并行或向量化;想加速得手动用 std::ranges::count 配合执行策略(但目前标准不支持,C++23 也没加),真要并行请回退到 std::count + std::execution::par。
真正省心的是接口一致性:不用再传 begin()/end() 迭代器对,尤其配合管道操作符时更简洁。但别指望它比老版快——它只是写起来少打几个字母。
容易忽略的是:如果元素类型重载了 operator== 但行为非对称或有副作用,std::ranges::count 的结果可能出人意料,且难以调试。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










