C++ STL(2)--算法(1)

2023-12-19

算法(1)----STL里的查找函数,主要分顺序查找和二分查找。
一、顺序查找9个,元素若是对象必须支持 == 运算符。
1. find: 用于在指定范围内查找和目标元素值相等的第一个元素。

find() 函数除了可以作用于序列式容器,还可以作用于普通数组。

代码示例:

	vector<int> v1 = { 8, 3, 5, 4, 1, 6, 2 };
	vector<int>::iterator it = find(v1.begin(), v1.end(), 6);
	if (it != v1.end()) {
		cout << "找到:" << *it << endl;
	}
	else {
		cout << "没找到" << endl;
	}
2. find_end: 在序列 A 中查找序列 B 最后一次出现的位置。

可以传入普通函数或函数对象,作为自定义查找规则。

代码示例:

//以函数对象的形式定义一个匹配规则
class compare {
public:
	bool operator()(const int& i, const int& j) {
		return (i % j == 0);
	}
};
int main() {
	vector<int> v1{ 2,4,6,4,8,12,18,1,2,3 };
	int arr[] = { 2,4,6 };
	vector<int>::iterator it = find_end(v1.begin(), v1.end(), arr, arr + 3, compare());
	if (it != v1.end()) {
		cout << "最后一个被{2,4,6}整除的起始位置为:" << it - v1.begin() << ",*it = " << *it;
	}
	return 0;
}
3. search: 在序列 A 中查找序列 B 第一次出现的位置。

可以传入普通函数或函数对象,作为自定义查找规则。

代码示例:

	vector<int> v1{ 1,2,3,4,1,2,3,8,1,2,3 };
	int arr[] = { 1,2,3 };
	vector<int>::iterator it = search(v1.begin(), v1.end(), arr, arr + 3);
	if (it != v1.end()) {
		cout << "第一个{1,2,3}的起始位置为:" << it - v1.begin() << ",*it = " << *it << endl;
	}
4. search_n: 用于在指定区域内查找第一个符合要求的子序列(里面的元素相同)。

可以传入普通函数或函数对象,作为自定义查找规则。

代码示例:

	vector<int> v1{ 1,2,3,4,6,6,6,8,1,2,6,6,6 };
	vector<int>::iterator it = search_n(v1.begin(), v1.end(), 3, 6);//找{6,6,6}
	if (it != v1.end()) {
		cout << "第一个{6,6,6}的起始位置为:" << it - v1.begin() << endl;
	}
5. find_first_of: 在 A 序列中查找和 B 序列中任意元素相匹配的第一个元素。

可以传入普通函数或函数对象,作为自定义查找规则。

代码示例:

    char a[] = "abcdefg";
	char ch[] = "fc";
	char* it = find_first_of(a, a + 7, ch, ch + 2);
	if (it != a + 7) {
		cout << "找到的第一个是:" <<*it<<",位置是:"<<it - a << '\n';
	}
6. find_if: 根据指定的查找规则,在指定区域内查找第一个符合要求的元素。
find_if_not: 和find_if相反,查找第一个不符合要求的元素。

传入普通函数或函数对象,作为自定义查找规则。

代码示例:

class compare {
public:
	bool operator()(const int& i) {
		return ((i % 2) == 1);
	}
};
int main() {
	vector<int> v1{ 4,2,3,1,5 };
	//查找第一个奇数
	vector<int>::iterator it = find_if(v1.begin(), v1.end(), compare());
	cout << "*it = " << *it<<endl;
	//查找第一个非奇数
	it = find_if_not(v1.begin(), v1.end(), compare());
	cout << "*it = " << *it<<endl;
	return 0;
}
7. adjacent_find: 在指定范围内查找最先 2 个连续相等的元素。

可以传入普通函数或函数对象,作为自定义查找规则。

代码示例:

    std::vector<int> v1{ 5,6,6,3,2,1,2,2 };
	auto it = adjacent_find(v1.begin(), v1.end());
	if (it != v1.end()) {
		cout << "找到: " << *it << endl;
	}
	else {
		cout << "没找到. " << endl;
	}
8. count: 统计指定元素的个数

可以传入普通函数或函数对象,作为自定义查找规则。

代码示例:

class AA
{
	int m_v;
public:
	AA(int v) :m_v(v) {

	}
	bool operator == (const AA& other) 
	{
		return other.m_v == m_v;
	}
};
int main() {
	AA a(2);
	std::vector<AA> v1{ 5,6,6,3,2,1,2,2 };
	int num = count(v1.begin(), v1.end(), a);
	cout << "对象AA(2)的个数:" <<num << endl;
	return 0;
}

关联式容器set、map自带成员函数count().

9. count_if: 统计满足条件的元素个数

可以传入普通函数或函数对象,作为自定义查找规则。

bool CompFind(int val)
{
	return val == 6;
}
int main() {
	std::vector<int> v1{ 5,6,6,3,2,1,2,2 };
	int num = count_if(v1.begin(), v1.end(), [](int val) { return val == 2; });
	cout << "数字2的个数:" <<num << endl;

	int num2 = count_if(v1.begin(), v1.end(), CompFind);
	cout << "数字6的个数:" << num2 << endl;
	return 0;
}
二、二分查找4个,元素若是对象必须支持 < 运算符。

仅适用于已排好序的序列。所谓“已排好序”,指的是查找区域内所有令 element<val(或者 comp(element,val),其中element 为指定范围内的元素)成立的元素都位于不成立元素的前面。

1. lower_bound: 在指定区域内查找不小于目标值的第一个元素。

使用此函数查找,最终找到的是大于或等于目标值的元素。

代码示例:

	vector<int> v1{ 2,1,4,5,9,6,8 };
	vector<int>::iterator it = lower_bound(v1.begin(), v1.end(), 3);
	if (it != v1.end()) {
		cout << "找到:" << *it;
	}
2. upper_bound: 在指定范围内查找大于目标值的第一个元素。

代码示例:

vector<int> v1{ 2,1,4,5,9,6,8 };
	vector<int>::iterator it = upper_bound(v1.begin(), v1.end(), 4);
	if (it != v1.end()) {
		cout << "找到:" << *it;
	}
3. equal_ranage: 用于在指定范围内查找等于目标值的所有元素。

实现调用的是lower_bound和upper_bound。

代码示例:

class compare {
public:
	bool operator()(const int& i, const int& j) {
		return i > j;
	}
};
int main() {
	vector<int> v1{ 7,8,9,6,6,6,3,2,1,5,4 };
	pair<vector<int>::iterator, vector<int>::iterator> range2;
	//在容器中找到所有的元素6
	range2 = equal_range(v1.begin(), v1.end(), 6, compare());
	for (auto it = range2.first; it != range2.second; ++it) {
		cout << *it << " ";
	}
	return 0;
}

说明:v1容器中存储的序列虽然整体是乱的,但对于目标元素 6 来说,所有符合 compare(element, 6) 规则的元素都位于其左侧,不符合的元素都位于其右侧,因此认为有序。

4. binary_search: 查找指定区域内是否包含某个目标元素。

实现调用的是lower_bound。

代码示例:

class compare {
public:
	bool operator()(const int& i, const int& j) {
		return i > j;
	}
};
int main() {
	vector<int> v1{ 6,4,5,1,2,0 };
	//从容器查找元素 3
	bool hasElem = binary_search(v1.begin(), v1.end(), 3, compare());
	cout << "hasElem:" << hasElem;
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL(2)--算法(1) 的相关文章

  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list

随机推荐

  • Web自动化测试流程:从入门到精通,帮你成为测试专家

    摘要 Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具
  • 计算智能 | 蚁群算法——旅行商问题(TSP)python

    目录 一 求解TSP city31 问题的python代码 二 python运行结果 一 求解TSP city31 问题的python代码 import numpy as np import random import matplotlib
  • ArrayList 扩容机制

    2023 12 18 ArrayList的构造函数 ArrayList 默认创建长度为0的数组 ArrayList int initialCapacity 创建指定容量的数组 ArrayList Collection
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + 前后端分离 + 二次开发

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • 求你了!别再问我怎么学 Python 了

    很多小伙伴问如何学习 Python 哪里可以找到实战的 Python 项目 有没有爬虫案例等等 今天给大家分享一份我整理的 Python 项目大全学习资料 文末有获取方式 话不多说 直接上干货 首先 全部资料目录压缩 由于内容较多 这里也仅
  • 去除微信小程序里button的边框

    去除微信小程序里面的button边框 方法一 通过button after button after border none 方法二 给button按钮加上plain属性 属性值为true
  • 【光伏预测】基于遗传优化注意力机制的长短时记忆神经网络GA-attention-LSTM实现数据回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 代码获取 论文复现及科研仿真合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab完整代码及仿真定制内容点击 智能优化算法 神经网络预测 雷达通信
  • 一文弄懂事件Event与Kafka的区别

    事件 Event 和 Apache Kafka 是两个概念层面上有所不同的东西 它们在应用程序中的作用和使用场景也有很大的差异 1 概念和定义 事件 Event 事件是 系统内发生 的特定事情或状态变化的表示 在编程和软件设计中 事件通常被
  • GLAB | CCNP+CCNP(厂商融合课)-12月23日开课啦

    敲重点 12月23日 CCNP HCIP 周六开课啦 CCNP Cisco Certified Network Professional 思科认证网络专业人员 CCNP专业人员表示通过认证的人员具有丰富的网络知识 获得CCNP认证的专业人员
  • 美创“四大能力”为工业企业数据安全构筑韧性防线

    12月14日 数据与网络安全创新 赋能工业企业数字化转型 主题沙龙在杭州举行 本次活动由浙江省工业软件产业技术联盟 浙江省网络空间安全创新研究中心 浙江省图灵互联网研究院主办 浙江省网络空间安全协会数据安全治理专委会 杭州市计算机学会 长三
  • 基于Java的在线投稿系统设计与实现(源码齐全可用)

    项目描述 临近学期结束 还是毕业设计 你还在做java程序网络编程 期末作业 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 你想解决的问题 今天给大家介绍一篇基于Java的在线投稿系统
  • 【实战详解】如何快速搭建接口自动化测试框架?Python + Requests

    摘要 本文主要介绍如何使用Python语言和Requests库进行接口自动化测试 并提供详细的代码示例和操作步骤 希望能对读者有所启发和帮助 前言 随着移动互联网的快速发展 越来越多的应用程序采用Web API 也称为RESTful API
  • 功放诊断测试

    1 切换trace显示时间模式 Toggle time mode 2 测seedkey 需要加载seednkey dll 3 功能寻址和物理寻址切换
  • 每日一练 | 华为认证真题练习Day32

    Day32 华为认证中级考试真题 1 关于MPLS中标签的封装格式的描述 正确的是 多选 A MPLS单个标签总长度为4个字节 32bit B 标签中TTL字段和IP分组中的TTL意义相同 也具有防止环路的作用 C 标签中的S字段 1bit
  • Web自动化测试流程:从入门到精通,帮你成为测试专家

    摘要 Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具
  • 基于ssm校园交友网站设计与实现(源码齐全可用)

    项目描述 临近学期结束 还是毕业设计 你还在做java程序网络编程 期末作业 老师的作业要求觉得大了吗 不知道毕业设计该怎么办 网页功能的数量是否太多 没有合适的类型或系统 等等 你想解决的问题 今天给大家介绍一篇基于ssm校园交友网站设计
  • 鸿蒙开发之页面路由(router)

    页面路由 router 页面路由指在应用程序中实现不同页面之间的跳转和数据传递 HarmonyOS提供了Router模块 通过不同的url地址 可以方便地进行页面路由 轻松地访问不同的页面 本文将从 页面跳转 页面返回 和 页面返回前增加一
  • 北京机器视觉技术的商业化应用与市场趋势分析

    随着科技的快速发展 机器视觉技术已经逐渐成为工业自动化 智能制造等领域的重要技术之一 北京作为中国的科技创新中心 其机器视觉技术的发展和应用也备受关注 本文将分析北京机器视觉技术的商业化应用以及市场趋势 一 商业化应用 工业自动化 机器视觉
  • 更新升级 | iTOP-RK3588开发板手册分类详解

    迅为iTOP RK3588开发板配套手册升级 因为开发资料众多 目前手册资料已达2700 页 为了方便大家更快速上手使用开发板 迅为iTOP RK3588开发板配套手册按功能性分为了13大类 如下所示 1快速定位 每个分类下包含了对应主题的
  • C++ STL(2)--算法(1)

    算法 1 STL里的查找函数 主要分顺序查找和二分查找 一 顺序查找9个 元素若是对象必须支持 运算符 1 find 用于在指定范围内查找和目标元素值相等的第一个元素 find 函数除了可以作用于序列式容器 还可以作用于普通数组 代码示例