0

0

c++ count函数用法_c++统计容器元素出现次数

冰火之心

冰火之心

发布时间:2026-01-15 09:38:02

|

858人浏览过

|

来源于php中文网

原创

std::count是中的非成员函数,需传入begin()/end()迭代器区间,不适用于map/unordered_map;与map::count同名但语义不同,前者统计出现次数,后者仅判断key存在性。

c++ count函数用法_c++统计容器元素出现次数

count 函数必须搭配 begin()/end() 迭代器使用

std::count 中的非成员函数,不作用于容器本身,而是对任意迭代器区间计数。它不会自动识别容器类型,也不能直接传入容器对象(比如写 count(vec) 会编译失败)。

常见错误是误以为它是容器成员函数,结果出现 error: ‘count’ is not a member of ‘std::vector

  • 正确调用形式: count(container.begin(), container.end(), value)
  • 适用于所有支持前向迭代器的容器: std::vectorstd::liststd::dequestd::array,甚至原生数组(用指针)
  • std::map / std::unordered_map 无效——它们的 value_typepair,不能直接用 count 查 key 或 value;查 key 是否存在应改用 map.count(key)(这是成员函数,别混淆)

count 和 map::count 容易重名但完全无关

这是最常踩的坑:std::count(算法)和 std::map::count(成员函数)同名但语义不同,头文件、参数、返回值都不同。

  • std::count(first, last, val) → 返回 val 在区间中出现的总次数(整数),需 #include
  • map.count(key) → 返回 1(存在)或 0(不存在),仅用于判断 key 是否存在,**不统计 value 出现次数**,也不适用于重复 key 场景(因为 map key 唯一)
  • 若想统计 std::multimap 中某 key 出现几次,才该用 multimap.count(key)(成员函数);而 std::count 依然只能遍历 value 或整个 pair

统计自定义类型或浮点数要小心相等判断

std::count 内部用 operator== 比较,所以行为完全取决于你提供的类型是否正确定义了 ==,以及比较逻辑是否符合预期。

立即学习C++免费学习笔记(深入)”;

Lifetoon
Lifetoon

免费的AI漫画创作平台

下载
  • 对于自定义结构体,没重载 operator== 会导致编译错误或逐字节比较(未定义行为)
  • float / 直接用 count 判断“相等”极不可靠,因为浮点误差会让 a == b 失效;此时应改用 std::count_if + 自定义谓词(例如 abs(a - b) )
  • 字符串比较区分大小写:count(v.begin(), v.end(), "abc") 不会匹配 "ABC"

性能:count 是 O(n),map::count 是 O(log n) 或平均 O(1)

选择哪个 count,本质是权衡数据结构和使用场景:

  • vectorlist 等序列容器,std::count 必须线性扫描,无法加速
  • std::set / std::map,查 key 存在性用其成员 count() 更快(红黑树 O(log n),哈希表平均 O(1))
  • 如果频繁按值查询频次,又需要增删改,考虑换用 std::unordered_map 手动维护计数,而非反复调用 std::count
#include 
#include 
#include 

int main() { std::vector v = {1, 2, 2, 3, 2, 4}; int cnt = std::count(v.begin(), v.end(), 2); // 返回 3 std::cout << cnt << "\n"; // 输出 3

// 错误示例(编译不过):
// int cnt2 = v.count(2); // no member function 'count'

return 0;

}

真正要注意的是:看到 count 就得下意识问一句——它来自 还是某个容器的成员?参数是迭代器还是 key?返回值是频次还是布尔意义的存在性?这三个问题没理清,90% 的误用就已发生。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

558

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

98

2025.10.23

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.20

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

195

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

187

2025.07.04

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

61

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号