std::count是定义在中的泛型算法,需传入左闭右开迭代器范围和值,不支持容器直接调用;自定义类型须重载operator==,复杂条件应改用std::count_if。

std::count 不是容器成员函数,而是定义在 <algorithm></algorithm> 中的泛型算法,必须传入迭代器范围 —— 这一点错用最多,直接写 v.count(x) 会编译失败。
std::count 的调用方式和头文件依赖
它只接受三个参数:first、last(左闭右开区间)、value,不支持容器直接调用。漏掉 #include <algorithm></algorithm> 是常见编译错误,报错信息通常是 ‘count’ was not declared in this scope。
- 必须显式指定范围:对
std::vector用v.begin(), v.end();对原生数组用arr, arr + n - 返回类型是
std::iterator_traits<it>::difference_type</it>,通常可安全赋给int或size_t,但注意有符号性差异(如vector::size()是size_t,而count返回可能是有符号) - 对
std::string、std::array、std::list同样适用,只要类型支持operator==
自定义类型必须重载 operator==
如果用 std::count 统计自定义类对象(比如 struct Person),编译器需要能比较两个对象是否“相等”。没定义 operator== 会导致类似 invalid operands to binary expression ('const Person' and 'const Person') 的错误。
- 只需提供
bool operator==(const T&, const T&),不一定要是成员函数 - 若逻辑复杂(如忽略大小写比较字符串字段),务必确保该
==行为与业务语义一致 - 若不想或不能改类型定义,应改用
std::count_if配合 lambda,绕过==依赖
std::count 和 std::count_if 的分工边界
std::count 只做“全等匹配”,而 std::count_if 才处理“条件统计”。试图用 count 实现“统计大于 10 的数”或“统计非空字符串”必然失败 —— 它没有谓词参数。
立即学习“C++免费学习笔记(深入)”;
- 简单值匹配(
==):优先用std::count,语义清晰、无额外开销 - 任意逻辑(
>、empty()、正则匹配等):必须用std::count_if,传入 lambda 或函数对象 - C++20 起可考虑
std::ranges::count,支持投影(proj),例如按.id字段统计对象,无需先提取视图
最易被忽略的是迭代器范围的“左闭右开”约定:count(v.begin(), v.end(), x) 正确,count(v.begin(), v.begin() + v.size(), x) 虽等价但冗余;而写成 count(v.begin(), v.end() - 1, x) 就会漏掉最后一个元素。


















