C++ Primer笔记——查找算法

2023-11-09

目录

一.简单查找

①find(first, last, val);

②find_if & find_if_not

③count & count_if

④all_of & any_of & none_of

二.重复值的查找

①adjacent_find(first, end);

②search_n(first, end, count, val);

 三.查找子序列

①search(first1, end1, first2, end2);

②find_first_of(first1, end1, first2, end2);

③find_end(first1, end1, first2, end2);


页数:P771(A.2.1查找对象的算法)

算法头文件:<algorithm>

参数注释:

first:序列的起始迭代器

last:序列的结尾迭代器

val:特定的一个值

unaryPred:自定义一元函数,用于自定义查找方式

binaryPred:自定义二元函数,用于自定义查找方式

一.简单查找

①find(first, last, val);

在first与last之间查找值为val的元素。如果有就返回该元素位置(迭代器),无就返回end迭代器。

使用示例:

int main()
{
	vector<int> arr = { 2, 4, 1 , 3, 5, 2, 4, 6 };
	vector<int>::iterator it = find(arr.begin(), arr.end(), 2);
	if (it == arr.end()) cout << "无";
	else cout << "有";
	return 0;
}

②find_if & find_if_not

find_if(first, last, unaryPred);

find_if_not(first, last, unaryPred);

 在first与last之间按指定方式查找元素。如果有就返回该元素位置(迭代器),无就返回end迭代器。

使用示例:

bool func(int n)
{
	if (n == 3) return true;
	return false;
}
int main()
{
	vector<int> arr = { 2, 4, 1, 3, 5, 2, 4, 6 };
	vector<int>::iterator it = find_if(arr.begin(), arr.end(), func);
	if (it == arr.end()) cout << "无";
	else cout << "有";
	return 0;
}

③count & count_if

count(first, last, val);

count_if(first, last, unaryPred); 

 在first与last之间,统计val值共出现多少次,返回一个记录出现次数的计数器(本质是int类型)。

 count_if目的与count一致,区别是统计方式不再是具体val值,而是自定义统计方式。

使用示例:

bool func(int n)
{
	if (n == 3 || n == 1 || n == 6) return true;
	return false;
}
int main()
{
	vector<int> arr = { 2, 4, 1, 3, 5, 2, 4, 6 };
	int sum = count(arr.begin(), arr.end(), 4);
	cout << sum << endl;
	sum = count_if(arr.begin(), arr.end(), func);
	cout << sum;
	return 0;
}

④all_of & any_of & none_of

all_of(first, last, unaryPred);

any_of(first, last, unaryPred);

none_of(first, last, unaryPred);

在first与last之间,上述三个函数目的分别是:按自定义函数(的方式)查找各元素都成功、对任意一个元素查找成功、所有元素查找都失败。

返回值为bool类型,成功返回true,失败返回false。

bool func(int n)
{
	if (n == 3) return true;
	return false;
}
int main()
{
	vector<int> arr = { 2, 4, 1, 3, 5, 2, 4, 6 };
	if (all_of(arr.begin(), arr.end(), func)) cout << "TRUE";
	else cout << "FALSE";
	cout << endl;
	if (any_of(arr.begin(), arr.end(), func)) cout << "TRUE";
	else cout << "FALSE";
	cout << endl;
	if (none_of(arr.begin(), arr.end(), func)) cout << "TRUE";
	else cout << "FALSE";
	return 0;
}

二.重复值的查找

①adjacent_find(first, end);

要求支持前向迭代器

查找相邻元素是否重复。如果有重复,返回第一对重复元素迭代器;没有则返回end迭代器。

同时该函数有重载类型,第三个参数为自定义函数,用于自定义查找方式:

adjacent_find(first, end, binaryPred);

使用示例:

int main()
{
	vector<int> arr = { 2, 4, 1, 3, 3, 2, 4, 6 };
	vector<int>::iterator it = adjacent_find(arr.begin(), arr.end());

//vector<int> arr = { 2, 4, 1, 3, 3, 2, 4, 6 };
//                             ^
//                             it

	if (it == arr.end()) cout << "无";
	else cout << *it;
	return 0;
}

②search_n(first, end, count, val);

查找在first到end之间,是否存在count个相邻的值为val的元素。若存在,返回重复的起始位置迭代器;否则返回end迭代器。

使用示例:

int main()
{
	vector<int> arr = { 2, 4, 1, 3, 0, 3, 2, 0, 4, 6, 0 };
	vector<int>::iterator it = search_n(arr.begin(), arr.end(), 3, 0);
	if (it == arr.end()) cout << "无";
	else cout << *it;
	cout << endl;
	arr = { 2, 4, 1, 3, 0, 0, 0, 3, 2, 0, 4, 6, 0 };
	it = search_n(arr.begin(), arr.end(), 3, 0);

//arr = { 2, 4, 1, 3, 0, 0, 0, 3, 2, 0, 4, 6, 0 };
//                    ^
//                    it

	if (it == arr.end()) cout << "无";
	else cout << *it;
	return 0;
}

 三.查找子序列

①search(first1, end1, first2, end2);

在first1到end1之间,查找有无特定子序列,子序列起始为first2,结尾为end2。

如果有,返回在范围first1到end1之间,第一次出现的位置迭代器;否则返回end1迭代器。

使用示例:

int main()
{
	vector<int> arr = { 2, 4, 1, 3, 0, 3, 2, 0, 4, 6, 0, 0, 3, 2 };
	vector<int> tmp = { 0, 3, 2 };
	vector<int>::iterator it = search(arr.begin(), arr.end(), tmp.begin(), tmp.end());
	if (it == arr.end()) cout << "无";
	else cout << *it;
	return 0;
}

②find_first_of(first1, end1, first2, end2);

该函数是在first1到end1范围中,查找第一个与first2到end2中任意元素匹配的元素,并返回该位置迭代器;如果没有匹配的,返回end1迭代器。

举个例子,范围1是{3, 2, 3, 4, 5};范围2是{7, 4};那么在查找时,范围1从左到右第一个与范围2中匹配的元素是4。因此,返回4所在的迭代器。

使用示例:

int main()
{
	vector<int> arr = { 3, 2, 4, 1, 3, 0, 3, 2, 0, 4, 6, 0, 0, 3, 2 };
	vector<int> tmp = { 7, 1, 0, 4};
	vector<int>::iterator it = find_first_of(arr.begin(), arr.end(), tmp.begin(), tmp.end());

//vector<int> arr = { 3, 2, 4, 1, 3, 0, 3, 2, 0, 4, 6, 0, 0, 3, 2 };
//                          ^
//                          it

	if (it == arr.end()) cout << "无";
	else cout << *it;
	return 0;
}

③find_end(first1, end1, first2, end2);

该函数作用与search类似,不同是匹配的是子序列最后一次出现的位置,返回值与search类似。

使用示例:

int main()
{
	vector<int> arr = { 3, 2, 4, 1, 2, 3, 3, 2, 0, 4, 6, 1, 2, 3, 2 };
	vector<int> tmp = { 1, 2, 3};
	vector<int>::iterator it = find_end(arr.begin(), arr.end(), tmp.begin(), tmp.end());

//vector<int> arr = { 3, 2, 4, 1, 2, 3, 3, 2, 0, 4, 6, 1, 2, 3, 2 };
//                                                     ^
//                                                     it

	if (it == arr.end()) cout << "无";
	else cout << *(--it);
	return 0;
}                                          


如有错误,敬请斧正 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer笔记——查找算法 的相关文章

  • boost::asio + std::future - 关闭套接字后访问冲突

    我正在编写一个简单的 TCP 客户端来发送和接收单行文本 异步操作由 std future 处理 以便于超时阻塞查询 不幸的是 我的测试应用程序在破坏服务器对象时因访问冲突而崩溃 这是我的代码 TCP客户端 hpp ifndef TCPCL
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • qemu创建linux虚拟机(亲测有效,virt-manger方式)

    1 网桥的搭建 Bridge方式原理 Bridge方式即虚拟网桥的网络连接方式 是客户机和子网里面的机器能够互相通信 可以使虚拟机成为网络中具有独立IP的主机 桥接网络 也叫物理设备共享 被用作把一个物理设备复制到一台虚拟机 网桥多用作高级
  • linux下一个简单的TCP通信程序——客户端向服务端发送任意字符串

    程序目的 服务器端等待客户端连接 若连接成功 则用户可以通过服务器在接受到字符串后进行判断 若不是quit字符串则输出客服端的地址信息 以及接受到的数据 同时将接受到的数据按照原样再发给客服端 若是quit字符串则断开本次连接 问题以及解决
  • 代码点和代码单元

    codePoint和codeUnit 背景 在设计Java时决定采用16位的Unicode字符集 然而16位的Char类型已经不能满足描述所有Unicode字符的需要了 为了解决这个问题 故使用代码点和代码单元 区别 代码点 Code Po
  • C++数据结构X篇_06_C++单向循环链表实现

    本篇参考C 单向循环链表实现整理 先搞懂结构框架 后期根据视频利用c对内容实现 也可以对c有更高的提升 文章目录 1 链表定义 2 链表插入 3 链表打印 注意打印过程是跳过头节点head的 4 实验 单向循环链表与单向链表十分相似 具有关
  • Java 子类继承父类方法的重写(或者覆盖,override)

    1 子类重写父类方法的方法名 参数类型必须与父类被重写 被覆盖 的方法相同 2 子类方法的返回值类型必须小于等于父类被重写的方法的返回值类型 3 子类抛出的异常小于等于父类方法抛出的异常 4 子类的访问权限大于等于父类的访问权限 子类重写了
  • 文心千帆大模型测评分享,效果超出预期

    一 前言 现如今 随着ChatGPT的爆火越来越多的人开始关注人工智能领域了 大家都在尝试使用它来帮助自己在工作上提高效率亦或是解决一些问题 但ChatGPT是有一定的使用门槛的 首先需要我们 科学上网 才能访问 其次GPT4的价格相对来说
  • 2.关于剪枝算法的分类和论文整理

    第二篇 关于剪枝算法的分类 1 非结构化剪枝 1 1 非结构化的weights剪枝 2 结构化剪枝 2 1 Filter Channel Pruning 2 2 Neuron wise pruning 2 3 Group wise Prun
  • Ag-grid属性整理

    import ClickableStatusBarComponent from component clickableStatusBarComponent import HaearCustomComponent from component
  • 数字图像处理之二维码图像提取算法(十)

    这里来说明一下做这次的二维码提取算法用到的函数 最后再给出完整的代码 进行图像的二值化 这里可以使用opencv2里的函数threshold 当然在opencv里也有cvThreshold函数 这个函数可以具体参考 http blog cs
  • 电影院里一个男孩对他女友所做的全过程

    电影院里一个男孩对他女友所做的全过程 周末上电影院看电影 热得不行 提前入场好凉快凉快 坐定 见一对青年男女挽手走了进来 男孩大概二十三四岁模样 肩上挎着他女友的背包 手里拿着一包零食还有可乐 男孩轻声征询女孩究竟坐哪儿合适 女孩没说话 努
  • Hibernate 一对多 多对一 实例 及一些 问题(1)插入及查询

    Clazz java package com wonders task sample bo import java util Set import javax persistence CascadeType import javax per
  • [安全开发]日志敏感信息检测-1-身份证

    前言 身份证号码格式 正则提取 地址码校验 校验码校验 优化思考 前言 防止敏感信息泄漏 保护用户和企业信息隐私 是企业安全中重要的环节 通过检测日志中的敏感信息 能够 排查潜在的泄漏敏感信息的系统和接口 防止被黑产恶意利用 盗取用户敏感信
  • vuex动态路由

    import router asyncRoutes constantRoutes from router import getRouters from api menu import Layout from layout index imp
  • 联想票务系统服务器,联想中国(Lenovo China)_服务频道_服务政策

    Lenovo ThinkServer Partner Pack for Microsoft System Center 重要通知 ThinkServer RD350 RD450 RD550 RD650 TD350 中Lenovo Think
  • APP开发如何批量生成不同尺寸的图标?

    在我们开发APP的时候 我们使用到大量的不同尺寸的APPLogo的图片 如下图 通常 我们的做法是和设计师沟通 让他们切出这儿所以的图片 然后我们一个一个图片放在对应的位置 这样处理的话 我们比较容易出错 比如说 图片的格式 苹果对图片的格
  • 4-数据结构-顺序表的查找

    说明 顺序表的查找 分为按照位置查找 返回对应值和按照值查找 返回该值位置 思路 getlist sqlist l int k 为按位查找 返回具体数值 locatelist sqlist l int k 按照值 去查找位置 因为顺序表都是
  • 吐血整理,性能测试-Jmeter分布式压测实战(超细详解)

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • wiringPi引脚编号方式

    树莓派引出的20 2排针引脚 引脚定义使用gpio readall命令查看 如下 可以看到wiringpi库有三种引脚编号方式 分别为 BCM编号方式 就是使用芯片的GPIO引脚编号 wiringpi库编号方式 使用wiringpi库自己规
  • LR(1)项目集族的构造:如何确定前向搜索符(新版)

    旧版链接 https blog csdn net hhhhhhhhhhkkkkkkkkkk article details 19990287 按照这个标题搜进来的各位是不是以为这也是和课本一样的内容呢 其实这是我看了两天课本才理解出来的内容
  • C++ Primer笔记——查找算法

    目录 一 简单查找 find first last val find if find if not count count if all of any of none of 二 重复值的查找 adjacent find first end