在 C++ 标准库中,count 是一个用于统计容器中特定元素出现次数的函数,定义在 <algorithm> 头文件中。它可以快速计算某个值在容器(如数组、vector、list 等)中出现的次数,避免手动编写循环计数的麻烦。

一、函数原型

count 函数有两种常用形式(以 vector<int> 为例):

// 1. 统计 [first, last) 范围内等于 value 的元素个数
template <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& value);
  • 参数说明
    • first:容器的起始迭代器(指向要统计的范围的第一个元素)。
    • last:容器的结束迭代器(指向要统计的范围的最后一个元素的下一个位置)。
    • value:要统计出现次数的目标值。
  • 返回值:目标值 value[first, last) 范围内出现的次数(类型为迭代器的差值类型,通常可视为 int)。

二、使用场景与示例

count 函数适用于所有支持迭代器的容器(如 vectorarrayliststring 等),核心作用是快速统计特定元素的出现次数

示例 1:统计 vector 中特定元素的次数
#include <iostream>
#include <vector>
#include <algorithm>  // 必须包含此头文件using namespace std;int main() {vector<int> nums = {1, 2, 3, 2, 4, 2, 5};int target = 2;// 统计 nums 中 2 出现的次数int cnt = count(nums.begin(), nums.end(), target);cout << "数字 " << target << " 出现了 " << cnt << " 次" << endl;// 输出:数字 2 出现了 3 次return 0;
}
示例 2:统计数组中特定元素的次数
#include <iostream>
#include <algorithm>using namespace std;int main() {int arr[] = {5, 3, 5, 7, 5, 9};int n = sizeof(arr) / sizeof(arr[0]);  // 数组长度int target = 5;// 统计数组中 5 出现的次数(用指针作为迭代器)int cnt = count(arr, arr + n, target);cout << "数字 " << target << " 出现了 " << cnt << " 次" << endl;// 输出:数字 5 出现了 3 次return 0;
}
示例 3:统计字符串中特定字符的次数
#include <iostream>
#include <string>
#include <algorithm>using namespace std;int main() {string s = "hello world";char target = 'l';// 统计字符串中 'l' 出现的次数int cnt = count(s.begin(), s.end(), target);cout << "字符 '" << target << "' 出现了 " << cnt << " 次" << endl;// 输出:字符 'l' 出现了 3 次return 0;
}

三、工作原理

count 函数的内部逻辑其实很简单,相当于一个「自动循环计数」的过程:

  1. first 迭代器开始,遍历到 last 迭代器(不包含 last 指向的位置)。
  2. 每遇到一个与 value 相等的元素,就将计数加 1。
  3. 遍历结束后,返回总计数。

可以理解为它替我们实现了这样的手动循环:

// 手动模拟 count 函数的逻辑
int manual_count(vector<int>& nums, int value) {int cnt = 0;for (int x : nums) {if (x == value) cnt++;}return cnt;
}

四、注意事项

  1. 必须包含头文件
    使用 count 函数前,必须包含 <algorithm> 头文件,否则会编译错误。

  2. 范围是左闭右开
    函数的统计范围是 [first, last),即包含 first 指向的元素,但不包含 last 指向的元素。例如:

    vector<int> nums = {1,2,3,4,5};
    // 只统计前3个元素(1,2,3)中 2 出现的次数
    int cnt = count(nums.begin(), nums.begin() + 3, 2);  // 结果为 1
    
  3. 元素必须支持 == 比较
    count 函数通过 == 运算符判断元素是否相等,因此容器中的元素类型必须支持 == 操作(如基本类型 intchar,或自定义类型重载了 == 运算符)。

  4. 时间复杂度
    count 函数需要遍历整个范围 [first, last),时间复杂度为 O(n)(n 是范围中元素的个数),与手动循环计数效率相同,但代码更简洁。

  5. 哈希表的count()
    unordered_map::count(key) 的返回值只有两种可能:0(键不存在)或 1(键存在)。
    这是因为 unordered_map不允许存在重复的键(每个键唯一对应一个值),所以「键的出现次数」要么是 0(不存在),要么是 1(存在)。

五、与 count_if 的区别

标准库中还有一个类似的函数 count_if,用于统计满足特定条件的元素个数(而非等于某个固定值)。例如:

// 统计 nums 中大于 3 的元素个数
vector<int> nums = {1,2,3,4,5,6};
int cnt = count_if(nums.begin(), nums.end(), [](int x) { return x > 3; });
// 结果为 3(4,5,6 满足条件)
  • count 适用于「等于某个值」的简单统计;
  • count_if 适用于「满足自定义条件」的复杂统计(需传入一个判断条件的函数或 lambda 表达式)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94467.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94467.shtml
英文地址,请注明出处:http://en.pswp.cn/web/94467.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tesla自动驾驶域控制器(AutoPilot HW)的系统化梳理

目前网络上对Tesla自动驾驶硬件&#xff08;AP1-AP4、HW1.0-HW4.0&#xff09;迭代的相关介绍比较混乱&#xff0c;本文这里进行系统化梳理并澄清&#xff0c;并对一些错误进行更正。1、AutoPilot HW迭代图图1 AutoPilot HWMCU迭代图图2 AutoPilot HW 散热设计迭代图&#xff0…

C 语言:第 20 天笔记:typedef(类型重命名规则、应用场景与实战案例)

C语言&#xff1a;第20天笔记 内容提要 构造类型枚举类型typedef综合案例:斗地主预处理 构造类型&#xff1a;枚举类型 使用建议 如果定义不相干的常量&#xff0c;使用宏定义&#xff08;符号常量&#xff09;&#xff1b;如果需要定义一组相关联的常量&#xff08;如月份011、…

在 vue3 和 vue2 中,v-for 和 v-if 可以一起用吗,区别是什么

在 Vue 2 和 Vue 3 中&#xff0c;v-for 和 v-if 可以一起使用&#xff0c;但两者在处理顺序和推荐用法上存在明显区别&#xff0c;主要体现在优先级和最佳实践上&#xff1a; 1. Vue 2 中的 v-for 与 v-if优先级&#xff1a;v-for 的优先级高于 v-if。 这意味着 Vue 会先循环渲…

Linux-进程相关函数

文章目录Linux-进程相关函数父子进程关系父子进程地址空间getpid函数 获取本进程号getppid函数 获取当前进程的进程的父进程号getpgid函数 获取进程组号示例fork函数 创建进程区分父子进程exit函数 进程退出wait函数 等待子进程退出waitpid函数Linux-进程相关函数 每个进程都由…

数据挖掘 6.1 其他降维方法(不是很重要)

6.1 Other dimensionality reduction methods 6.1 其他降维方法 其他降维方法前言问题答案流形3 降维大纲3.1 线性方法3.2 非线性方法3.2.1 流形学习方法&#xff08;Manifold Learning&#xff09;3.2.2 概率方法&#xff08;Probabilistic Approaches&#xff09;3.2.3 拓扑数…

Unity中的特殊文件夹

一.工程路径获取print(Application.dataPath);只用于游戏开发编辑器模式下&#xff0c;游戏发布后此路径就不存在了二.Resources 资源文件夹//路径获取: //一般不获取 //只能使用Resources相关API进行加载 //如果硬要获取 可以用工程路径拼接print(Application.dataPath "…

Seaborn数据可视化实战:Seaborn高级使用与性能优化教程

Seaborn最佳实践与技巧 学习目标 本课程将深入探讨Seaborn库的高级使用技巧&#xff0c;包括性能优化、常见问题解决方法等&#xff0c;旨在帮助学员掌握如何高效地使用Seaborn进行数据可视化&#xff0c;提升图表的美观度和信息传达效率。 相关知识点 Seaborn最佳实践与技巧 学…

分布式系统与单机系统的优劣势对比

近期有遇到一个本地部署的需求&#xff0c;他们希望用主备方案&#xff0c;这就涉及到了备用系统怎么收费的问题。我们是单机系统&#xff0c;其他友商是分布式系统&#xff0c;那20坐席的手拨需求到底是选单机系统好&#xff0c;还是选分布式系统好呢&#xff1f;了解了两者的…

深度学习:从手写数字识别案例认识pytorch框架

目录 一、PyTorch 核心优势与框架定位 二、实战基础&#xff1a;核心库与数据准备 1. 关键库导入与功能说明 2. MNIST 数据集加载与可视化 &#xff08;1&#xff09;数据集下载与封装 &#xff08;2&#xff09;数据集可视化&#xff08;可选&#xff09; 3. DataLoade…

二分|组合|旋转数组

lc1976dijk min_pathpq. min_wlcr187同lc1823.约瑟夫环class Solution { public:int iceBreakingGame(int num, int target) {int x0;for(int i2;i<num;i){x(xtarget)%i;} return x;} };lc2972计算数组中可移除的子数组数量先找最长递增前缀&#xff0c;再结合递增后缀…

【C语言16天强化训练】从基础入门到进阶:Day 10

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向学习者…

云计算与云原生技术探索

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

STM32之ADC详解

一、ADC概述 ADC&#xff08;模拟量转数字量转换器&#xff09;&#xff0c;在 STM32 开发中&#xff0c;利用 ADC 端口的电压数据&#xff0c;转换为对应的具体数字量数据内容。可通过 ADC 方式获取常用数据内容有&#xff1a; 光敏电阻、电池电量、油箱油量 ADC 转换…

深入理解计算机网络:从基础到应用的全面解析

标题&#xff1a;深入理解计算机网络&#xff1a;从基础到应用的全面解析 引言 计算机网络已经渗透到我们生活的方方面面。从家庭Wi-Fi到全球互联网&#xff0c;我们每天都在通过各种设备进行数据交换。本文将带领你走进计算机网络的世界&#xff0c;深入探讨网络的基础知识、常…

以结构/序列/功能之间的关系重新定义蛋白质语言模型的分类:李明辰博士详解蛋白质语言模型

上海交通大学第三届「AI for Bioengineering 暑期学校」于 2025 年 8 月 8—10 日正式开启。本次暑期学校汇聚了自全球 70 余所高校、 10 余所科研机构及 10 余家行业领军企业的 200 余位青年才俊、科研学者和产业代表&#xff0c;共同聚焦于人工智能&#xff08;AI&#xff09…

【大语言模型 15】因果掩码与注意力掩码实现:深度学习中的信息流控制艺术

【大语言模型 15】因果掩码与注意力掩码实现&#xff1a;深度学习中的信息流控制艺术 关键词&#xff1a;因果掩码、注意力掩码、下三角掩码、Padding掩码、序列建模、GPT解码器、BERT编码器、批量处理优化、自回归语言模型、信息流控制 摘要&#xff1a;在Transformer架构中&a…

大型电动化工程机械设备智能施工试验场的网络设计方案

随着工程机械设备逐步迈向智能化、电动化和无人化&#xff0c;传统施工试验场已经难以满足现代化施工设备的研发、测试和验证需求。为了适应这一趋势&#xff0c;建设一个基于高性能网络架构的大型智能施工试验场成为关键。本文将从网络架构、设备选型和功能实现等方面&#xf…

SPMI总线协议(一)

1、简单说明 系统电源管理接口( System Power Management Interface简称SPMI)是一种双线串行接口,用于连接片上系统(SoC)处理器系统的集成电源控制器(PC)与一个或多个电源管理集成电路(PMIC)电压调节系统。SPMI 使系统能够使用单个 SPMI 总线动态调整 SoC 内部电压域的…

数据存储的思考——从RocketMQ和Mysql的架构入手

数据存储是后台服务系统永远绕不开的知识 笔者希望能够从宏观的角度出发&#xff0c;思考数据存储系统的共性和设计方案&#xff0c;尝试从Mysql和RocketMQ的角度去思考谈谈系统存储架构的设计哲学 前置的知识 什么是RocketMQ、什么是Mysql&#xff0c;他们对于后端系统的主用…

MySQL 面试题系列(二)

目录1: SQL 中常见的 JOIN 类型有哪些&#xff1f;请分别说明其连接逻辑和适用场景。2: UNION 和 UNION ALL 有什么区别&#xff1f;它们各自的适用场景是什么&#xff1f;3: 什么是视图 (View)&#xff1f;它的作用和优缺点是什么&#xff1f;4: 什么是索引 (Index)&#xff1…