工作中经常遇见的一个场景:判断某个元素是否在vector容器中。

当然,会有很多种方法,由内置数据类型到自定义数据类型,下面简单总结一下。

【1】内置数据类型

代码胜过一切文档。如下示例代码:

#include <iostream>
#include <vector>
#include <string>// 为了便于示例,声明全局容器
std::vector<std::string> strVec;void methods(const std::string& target)
{// 方法一:遍历容器,查找相等元素判断是否存在{for (const auto& item : strVec){if (item == target){std::cout << "method1: find " << target << " exists." << std::endl;break;}}}// 方法二:获取元素个数,通过个数判断是否存在{int nCount = std::count(strVec.begin(), strVec.end(), target);if (nCount > 0){std::cout << "method2: find " << target << " exists." << std::endl;}}// 方法三:查询元素迭代器,通过迭代器有效性判断是否存在{auto iter = std::find(strVec.begin(), strVec.end(), target);if (iter != strVec.end()){std::cout << "method3: find " << target << " exists." << std::endl;}}// 方法四:查询相等元素的迭代器,通过迭代器有效性判断是否存在{auto iter = std::find_if(strVec.begin(), strVec.end(), [&](const std::string& item)->bool{ return (item == target); });if (iter != strVec.end()){std::cout << "method4: find " << target << " exists." << std::endl;}}
}int main()
{strVec = { "C", "C++", "Java", "Python", "Lua", "Sql" };// 场景1:查找Rubystd::cout << "Find Ruby" << std::endl;methods("Ruby");// 场景2:查找C++std::cout << "Find C++" << std::endl;methods("C++");system("pause");return 0;
}// result
/*
Find Ruby
Find C++
method1: find C++ exists.
method2: find C++ exists.
method3: find C++ exists.
method4: find C++ exists.
*/

【2】自定义数据类型

代码胜过一切文档。如下示例代码:

#include <iostream>
#include <map>
#include <string>
#include <vector>struct Student
{std::string code;  // 学号(唯一性标识)int grade;         // 年级std::map<std::string, double> scores; // <科目,成绩>bool operator==(const Student& obj) const{return obj.code == code; // 只要学号相同即可}
};// 为了便于示例,声明全局容器
std::vector<Student> vecStu;void methods(const Student& target)
{// 方法一:遍历容器,查找相等元素判断是否存在{for (const auto& item : vecStu){if (item == target){std::cout << "method1: find exists." << std::endl;break;}}}// 方法二:获取元素个数,通过个数判断是否存在{int nCount = std::count(vecStu.begin(), vecStu.end(), target);if (nCount > 0){std::cout << "method2: find exists." << std::endl;}}// 方法三:查询元素迭代器,通过迭代器有效性判断是否存在{auto iter = std::find(vecStu.begin(), vecStu.end(), target);if (iter != vecStu.end()){std::cout << "method3: find exists." << std::endl;}}// 方法四:查询相等元素的迭代器,通过迭代器有效性判断是否存在{if (std::find_if(vecStu.begin(), vecStu.end(), [&](const Student& obj)->bool{ return (obj == target); }) != vecStu.end()){std::cout << "method4: find exists." << std::endl;}}
}int main()
{vecStu.push_back({ "080605109", 6, { {"English", 100}, {"China", 100} } });vecStu.push_back({ "080605110", 7, { {"English", 99}, {"China", 70} } });vecStu.push_back({ "080605111", 8, { {"English", 98}, {"China", 69} } });vecStu.push_back({ "080605112", 6, { {"English", 97}, {"China", 68} } });vecStu.push_back({ "080605113", 7, { {"English", 96}, {"China", 67} } });Student obj = { "080605114", 8, { {"English", 95}, {"China", 66} } };vecStu.push_back(obj);// 场景1:查找学号为[0806005109]的学生,我们暂不关注成绩std::cout << "Find code: 0806005108" << std::endl;methods(Student{ "0806005108", {} });// 场景2:查找学号为[0806005114]的学生,我们暂不关注成绩std::cout << "Find code: 0806005114" << std::endl;methods(obj);// 场景3:不想通过学号,只想查找六年级,是否存在英语和语文全为满分的学生auto iter = std::find_if(vecStu.begin(), vecStu.end(), [&](const Student& obj)->bool{ return (obj.grade == 6 &&obj.scores.find("English")->second == 100 &&obj.scores.find("China")->second == 100); });if (iter != vecStu.end()){std::cout << "method: find 100 exists." << std::endl;}return 0;
}// result
/*
Find code: 0806005108
Find code: 0806005114
method1: find exists.
method2: find exists.
method3: find exists.
method4: find exists.
method: find 100 exists.
*/

注意:自定义数据类型,必须重载==符号。

原因很简单:遇见这种场景,计算机弄不明白你想让它以什么标准来判断两个对象相等,所以你得给它确定了相等的标准或准则。

综上所述,再强调一点:针对自定义数据类型,使用std::find_if方法,显而易见,自由度很大。

判断vector中是否存在某元素的多种方法相关推荐

  1. 删除list列表中的某一个元素的多种方法

    转载: https://www.cnblogs.com/blogsofmy/p/10955171.html 当我们在处理业务的时候,很多情况下数据都要进行一层层的过滤,最近需要给一个列表中去除不符合条 ...

  2. php in_array 判断数组中是否存在此元素

    判断数组中是否存在此元素在php中很简单,直接使用 in_array即可.用法如下 : <?php $array_1=array('red','blue','green'); if(in_arr ...

  3. js 判断数组中是否包含某个元素

    判断数组中是否包含某个元素的八种方法 方法一:array.indexOf (item,start):元素在数组中的位置,如果没与搜索到则返回 -1. 参数 描述 item 必须.查找的元素. star ...

  4. php判断数组中的键是否是某个字符串,php判断数组中是否存在指定键(key)的方法...

    搜索热词 本文实例讲述了PHP判断数组中是否存在指定键(key)的方法.分享给大家供大家参考.具体分析如下: PHP中有两个函数用来判断数组中是否包含指定的键,分别是array_key_exists和 ...

  5. php 存在键,php判断数组中是否存在指定键(key)的方法

    本文实例讲述了php判断数组中是否存在指定键(key)的方法.分享给大家供大家参考.具体分析如下: php中有两个函数用来判断数组中是否包含指定的键,分别是array_key_exists和isset ...

  6. java 判断是否是小数_判断字符串中是否是整数和小数的方法

    判断字符串中是否是整数和浮点数的方法有几种方式,下面分别介绍: 1.用JAVA自带的函数,判断是否为整数 public static boolean isNumeric(String str) { f ...

  7. QT界面中实现视频帧显示的多种方法及应用

    QT界面中实现视频帧显示的多种方法及应用 (一) 引言 1.1 视频帧在QT界面中的应用场景 1.2 不同方法的性能和适用性分析 1.2.1 使用QLabel和QPixmap 1.2.2 使用QPai ...

  8. php post undefined index,PHP 中提示undefined index如何解决(多种方法)

    一.相关信息 平时用$_post['']或$_get['']获取表单中参数时会出现Notice: Undefined index: --------: 以及我们经常接收表单POST过来的数据时报Und ...

  9. JavaScript(JS) 清空删除数组元素的多种方法及示例代码

    简介: 本文主要介绍JavaScript(JS)中,清空删除数组中的所有元素的多种方法,以及相关的示例代码. 1.使用[]得到一个新数组进行清空 例如, var arr1 = ['a','b','c' ...

最新文章

  1. Window7系统 中常见的进程命令分析?
  2. 利用vim查看日志,快速定位问题《转载》
  3. oppo计算机打不开怎么回事,一体机电脑突然关机了?然后就打不开了怎么回事啊?...
  4. PHP 笔记——操作MySQL数据库
  5. 最适合做老婆主播不是Rita?不是豚豚,也不是纪小鹿,是她
  6. sql 统计记录条数后 打印出所有记录_用SQL完成购买行为分析(下篇II)
  7. Hibernate查询方式
  8. oracle设置打印机,使用 Oracle Solaris 打印管理器设置网络连接的打印机
  9. 查看usb控制器固件日期_三星发布两款USB Type-C电源控制器芯片 支持100W的充电功率...
  10. android 正在上传动画,安卓系统上传文件动态显示进度条,进度条经常卡在99%有时也会卡住不显示完整的文字。...
  11. android studio获取数字签名,Android应用开发Android Studio数字签名打包apk图文步骤教程...
  12. 删除远程桌面记录的两种方式介绍
  13. app逆向案例分析-极速抖音
  14. 虚拟机服务器一直自动关机,诡异的Vmware虚拟机自动关机故障
  15. snownlp抛出错误_网易云评论爬虫及情感分析
  16. 清华、南京大学计算机系女神非常敬佩的IT公众号
  17. 天创速盈:拼多多低价引流怎么玩?大部分中小卖家都不知道
  18. CSS 3之文字样式
  19. Centos 7 部署 OpenStack_Rocky版高可用集群3-1
  20. 3d渲染服务器系统,3d渲染云服务器

热门文章

  1. 输出N阶方阵 ,输出该方阵及方阵主对角线的总和
  2. 收藏几个好用的webservice
  3. CocosCreator Lerp插值
  4. 建立适当的索引(ZZ)
  5. 组策略 gpedit.msc 及修复“无法为文件 appv.admx (*.admx)找到适当的资源文件(错误=2)”报错
  6. python预测糖尿病_使用决策树与随机深林预测糖尿病(python)
  7. 【洛谷题解】P2356 弹珠游戏
  8. pycharm+django创建一个搜索网页
  9. 学习大数据,公司常用开发的编程语言是什么?
  10. LDA主题模型学习心得