泛型算法——只读算法(二)

C++泛型算法 记录泛型算法的相关知识 阅读详情

equal

在 C++ 标准库中,std::equal是一个泛型算法,用于比较两个序列(范围)中的元素是否相等。
  1. 函数原型
template <class InputIt1, class InputIt2>
bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2);

template <class InputIt1, class InputIt2, class BinaryPredicate>
bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p);

参数
● first1, last1:第一个序列的范围 [first1, last1)。
● first2:第二个序列的起始位置。
● p:自定义的二元谓词(可选),用于定义“相等”的条件。

返回值
● true:如果两个序列在指定范围内相等。
● false:否则。

  1. 示例代码:基础比较(默认相等条件)
#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2 = {1, 2, 3, 4, 5};
    std::vector<int> v3 = {1, 2, 3, 4, 6};

    // 比较整个范围是否相等
    bool same1 = std::equal(v1.begin(), v1.end(), v2.begin());
    bool same2 = std::equal(v1.begin(), v1.end(), v3.begin());

    std::cout << "v1 vs v2: " << std::boolalpha << same1 << std::endl; // 输出 true
    std::cout << "v1 vs v3: " << same2 << std::endl;                   // 输出 false

    return 0;
}
  1. 示例代码:自定义比较条件

比较两个序列是否满足自定义的“近似相等”条件(如浮点数误差允许范围内):

#include <algorithm>
#include <vector>
#include <cmath>

bool approxEqual(double a, double b) {
    return std::abs(a - b) < 0.001; // 允许误差小于 0.001
}

int main() {
    std::vector<double> a = {1.0, 2.0001, 3.0};
    std::vector<double> b = {1.0, 2.0, 3.0};

    bool isApprox = std::equal(a.begin(), a.end(), b.begin(), approxEqual);
    // 返回 true(2.0001 和 2.0 的差为 0.0001 < 0.001)

    return 0;
}
  1. 关键注意事项
第二个序列的长度必须足够
  • std::equal不会检查第二个序列的长度。若第二个序列短于第一个序列,会导致 未定义行为
  • 安全做法:比较前手动检查长度:
if (v1.size() != v2.size()) {
    return false;
}
bool same = std::equal(v1.begin(), v1.end(), v2.begin());
支持不同类型容器的比较
两个序列可以来自不同类型的容器(如vector和list),只要元素可比较:
std::vector<int> vec = {1, 2, 3};
std::list<int> lst = {1, 2, 3};
bool same = std::equal(vec.begin(), vec.end(), lst.begin()); // true
自定义谓词的要求
谓词 p 必须满足: p(a, b) 返回 bool,且不会修改传入的参数。 示例错误(修改元素):
// 错误:谓词不应有副作用
bool badPredicate(int& a, int& b) {
    a++; // 修改元素,导致未定义行为
    return a == b;
}
性能

● 时间复杂度:O(n),遍历所有元素直到发现不匹配或结束。
● 适用场景:中小型数据集的快速比较,或对性能不敏感的场景。

  1. 常见问题

Q1:如何比较两个完整容器(包括长度和内容)?

  • 直接比较容器(如果容器支持operator==)
if (v1 == v2) { /* ... */ } // vector/list/deque 等支持
  • 手动比较长度 + std::equal:
bool isSame = (v1.size() == v2.size()) 
              && std::equal(v1.begin(), v1.end(), v2.begin());

Q2:如何比较子范围?

  • 调整迭代器范围:
// 比较 v1 的前3个元素和 v2 的第2到第4个元素
bool same = std::equal(v1.begin(), v1.begin()+3, v2.begin()+1);
  • Q3:std::equal与 memcmp的区别?

● memcmp:按字节逐位比较,适用于 POD 类型(如基本类型、简单结构体),但 不适用于类对象(如 std::string)。
● std::equal:通过 operator== 或自定义谓词比较,适用于所有可比较类型。

  1. 总结

● 核心用途:快速比较两个序列的相等性,支持自定义比较逻辑。

● 安全要点:确保第二个序列足够长,避免未定义行为。
● 扩展性:通过自定义谓词,灵活定义“相等”条件。
合理使用 std::equal 可以简化代码并提高可读性,尤其适用于验证数据一致性(如测试用例)。

C++学习笔记(十六):对vector进行更多的操作——泛型算法 先强调一下,这里的泛型算法实际不光光是对vector的操作,对于“顺序容器”均可以。 但是什么是顺序容器: 我们都知道,容器就是一些特定类型对象的集合。而顺序容器为程序员提供了控制元素存储和访问的能力。这种容器的一个显著的特征,就是容器中元素的顺序不依赖于元素的值,而是与加入容器时的位置有关。常见的顺序容器有vector、deque(双端队列)、list(双向链表)、forward_list( 阅读详情

相关推荐

Kalibr标定避坑指南:如何用AprilGrid板快速完成双目IMU标定

本文详细介绍了使用AprilGrid板进行Kalibr双目IMU联合标定的实战技巧,包括标定工具选型、数据采集优化、标定流程及结果验证。通过AprilGrid板的唯一标识性和抗遮挡优势,结合IMU静止标定和运动激励设计,显著提升标定精度。文章还提供了常见报错处理和高级优化技巧,帮助开发者高效完成传感器标定。

sunny的博客 282

【C++容器和算法】泛型算法:概述

泛型算法通过模板与迭代器的结合,实现了高度抽象与复用,是 C++ 高效编程的基石。从基础查找排序到复杂自定义逻辑,掌握算法的使用场景与迭代器适配技巧,能大幅提升代码质量。结合 C++ 新特性(如 Ranges 库),更可进一步简化开发流程。后续可深入探索分区算法、堆操作等进阶内容,解锁更多编程可能。

byte轻骑兵的技术小窝 8313

Docker新手必看:解决‘Unable to find image’错误的完整指南

本文针对Docker新手常见的‘Unable to find image’错误,提供了完整的排查与解决指南。文章深入剖析了权限不足、网络连接失败、Docker服务未运行等核心原因,并给出了将用户加入docker组、配置镜像加速器等实用解决方案,帮助读者彻底理解并解决镜像拉取问题。

weixin_29230901的博客 241

C++primer -泛型算法

inserter(c, p) : 接受一个容器的引用c和迭代器p,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到迭代器所指位置之前(执行的是insert)back_inserter(c) : 接受一个容器的引用c,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到队尾(执行的是push_back)。front_inserter(c):接受一个容器的引用c,返回一个与该容器绑定的插入迭代器,该插入迭代器将赋值的拷贝插入到队首(执行的是push_front)

qq_36369228的博客 2077

两轮差速小车循线控制原理分析

硬件资料设定:小车驱动来自于两个相同的电机,转向依靠两轮差速实现,小车前后左右安装超声波传感器,前后各一个,左右各两个; 功能目标:假设小车左侧有墙壁,通过超声波测距实现按指定距离沿墙行驶 参数设定:车轮半径r=3cm,车轮间距wd=10cm,车身长length=16cm,侧边超声波传感器前后各一个,假设一个在车头一个在车尾,间距=车身=length=16cm,小车线速度恒定v = 0.2m/s,距离墙d=10cm,假设超声波传感器以10Hz的频率采集距离。 在以上条件下,设定小车出发点,方向与墙平行

aibingjin的博客 1万+

【小程序】支付宝直付通解决方案

支付宝直付通是支付宝为小程序提供的一种支付解决方案,可以实现小程序中直接使用支付宝进行支付。以上是一个简单的支付宝直付通解决方案及相关代码示例。具体的使用还需要根据自己的业务需求进行定制化开发和调整。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1281

泛型编程基础

1.C++两种抽象方法 (1)面向对象编程 封装(Encapsulation) 继承(Inheritance) 多态(Polymorphism) (2)泛型编程 概念(concepts) 模型化(modeling) 强化(refinement) 2.泛型编程概念 泛型编程(Generic Programming) 指在多种数据类型上皆可操作。和面向对象编程不同,它并不要求额...

万里归来少年心 1万+

C#上位机多PLC多协议开发思路:10年老工控师拆解实战方案,避坑90%的问题(附代码框架)

是否连接成功数据地址(如“DB1.DBW0”“D100”“4x0001”)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 948

【c++ primer 笔记】第10章 泛型算法

大多数算法定义在头文件algorithm中,部分在numeric中这些算法不直接操作容器,而是操作迭代器算法不会改变容器的大小。永远不会执行容器操作大多数算法是通过遍历两个迭代器标记的一段元素来实现其功能。算法永远不会改变底层容器的大小。算法可能改变容器中保存的元素的值,也可能在容器内移动元素,但不能直接添加或者删除元素。......

小呆鸟blog 1164

3.1 快速启动Flink集群

在本实战中,我们将快速启动Apache Flink 1.13.0集群,并在Hadoop集群环境中提交作业。首先,我们会在本地下载Flink安装包并上传至云主机,解压并配置环境变量。接着,我们将启动Flink集群,通过访问Web UI进行监控管理。然后,我们会配置集群,将Flink分发到从节点,并在集群上提交作业。最后,我们将通过命令行提交作业,并在Web UI上查看任务节点的输出结果。这个过程涵盖了Flink集群的部署、配置和作业提交,为大数据处理提供了一个完整的实战经验。

howard2005的专栏 727

基于业务目标的Agent自动化评测体系设计:超越准确率的有效性衡量

我们还是以电商全链路服务Agent我们还是以电商全链路服务Agent。

AI架构全栈开发实战笔记 318

C++ primer 泛型算法总结

文章目录1.泛型算法概述2.初始泛型算法2.1只读算法2.2 写容器元素的算法2.3 重排容器元素的算法3.定制操作3.1 向算法传递函数3.2 lambda表达式3.2.1 向lambda传递参数3.2.2 使用捕获列表3.2.3 指定lambda 返回类型3.3 参数绑定4.再探迭代器4.1 插入迭代器4.2 iostream 迭代器4.2.1 istream_iterator 迭代器4.2....

weixin_43282440的博客 854

国网DLT698.45协议——采集系统、数据交换(一)

对于国网698协议,是一种面向对象的通信协议,用于远程监控和控制电力系统中的设备。面向对象使得对协议的思考更趋向于正常思维,使计算机中描述的抽象世界于现实世界中能够更好的对应起来。协议中就是将各种方法和属性对应描述成类和对象。接下来是我学习该协议的一些总结和认识,欢迎大家随时在评论区或者私信我交流学习。:系统=对象+消息:程序=算法+数据对象和接口类描述:类描述了一组具有相同属性和相同方法的对象。

一个bug是bug,多个bug能work 1万+

C++//泛型算法

1. 初识泛型算法 泛型:可以作用于不同类型的元素和多种容器类型 算法:实现了一些经典算法诸如排序和搜索的接口。 泛型算法运行于迭代器之上,不会执行容器的操作。由此得出假定:泛型算法永远不会改变底层容器的大小。 输入范围:标准库算法都对一个范围内的元素进行操作,该范围称为输入范围。如果算法接受输入范围作为参数,通常用前两个参数表示范围,即第一个元素和尾后元素的迭代器。 大多数算法存储在algorithm头文件内,numeric中定义了一组数值泛型算法。 1.1 只读算法 只会读取输入范围中的元素,而不会改变

weixin_43918519的博客 1404

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

10.泛型算法

大多数算法都定义在头文件algorithm中。标准库还在头文件numeric中定义了一组数值泛型算法。一般情况下,这些算法并不直接操作容器,而是遍历由两个迭代器指定的一个元素范围来进行操作。

EdSheeran的博客 1260

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STL泛型算法

目录泛型算法概述※关键概念:泛型算法永远不会执行容器的操作泛型算法的结构只读算法※泛型算法中的"泛型操作"必须对元素类型是可行的※确保泛型算法不会访问不存在的元素写容器元素的算法※泛型算法不检查写操作back_insert_iterator和back_inserter拷贝算法(copy)重排容器元素的算法排序算法(sort)"删除"相邻重复元素(unique) 泛型算法概述 STL定义了一组泛型算法(generic algorithm),大多数算法都定义在头文件algorithm中,还有一组数值泛型算法定义

m0_55464171的博客 1276

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C++】泛型算法(二):初始泛型算法

对 C++ Primer 第五版第十章第二节初始泛型算法进行学习记录。

YGGP的博客 649

泛型算法

algorithm头文件中定义了大多数算法。 这些算法并不直接操作容器,而是遍历由两个迭代器指定的一个元素范围,对其中的每个元素进行一些处理。 迭代器令算法不依赖于容器类型,但是算法依赖于元素类型的操作。大多数算法都使用了一个(或多个)元素类型上的操作,因此,除了默认操作符(==,)外,我们还可以使用自定义的操作来代替默认操作。

cjaymj的博客 577

C++STL的泛型算法

泛型算法只是依赖于迭代器的操作,而不是依赖于容器 泛型算法可以分为3大类: 下面的vec和vec2代表相同类型的容器 1.只读算法:只允许读取其输入范围内的元素,而不改变元素 find(vec.cbegin(), vec.cend(), k) 查找算法:前两个参数表示元素范围的迭代器,第三个参数k表示要查找的元素,查找成功则返回等于第一个元素的迭代器,查找失败返回尾后指针...

jasonLee的博客 706

C++ 泛型算法简介

Generic Algorithm 标准容器库定义的操作集很小。标准容器库并未给每个容器添加大量功能,而是提供了一组算法,这些算法中大多数都独立于任何特定的容器。这些算法是通用的:它们可用于不同类型的容器和不同类型的元素。 本章主要介绍泛型算法和关于迭代器的更多细节。 对于前面介绍的顺序容器,它只定义了很少的操作:增删、访问首尾元素、确定容器是否为空、获得首和尾后元素位置的迭代器。 可以想象,除了上述的操作,用户还可能希望做其他有用的操作:查找特定元素、替换或删除一个特定的值、重排元素顺序等。 标准库并为针

Noob_Zhou的博客 859

第10章:泛型算法

顺序容器只定义了很少的操作,在多数情况下,我们可以添加和删除元素,访问首尾元素,确定容器是否为空以及获得只想首元素或尾元素之后位置的迭代器。 如果用户还希望做其他更多有用的操作呢:比如查找特定元素,替换或删除一个特定值,重排元素顺序等。 标注好难看并未给每个容器都定义成员函数来实现这些操作,而是定义了一组泛型算法,称它们为算法是因为他们实现了一些经典算法的公共接口,如排序和搜索,称它们是泛型的,是因为它们可以用于不同类型的元素和多种容器类型,不仅包括标准库类型,如vector或list,还包括内置数组类型。

tanfuz的博客 1182

C++ primer 第10章 泛型算法

文章目录概述findcount初识泛型算法只读算法只读算法accumulate只读算法equal写容器元素的算法算法fill算法fill_nback_inserter算法copy算法replace replace_copy重排容器元素的算法sortuniqueunique_copy定制操作向算法传递函数谓词算法stable_sort算法partitionlambda表达式lambda介绍算法fi...

weixin_43116900的博客 1829

第十章 泛型算法

C++之泛型算法

weixin_43739503的博客 1226

C++ 泛型算法(一)初识泛型算法,lambda表达式

文章目录概述算法工作原理泛型算法只读算法写容器算法重排容器元素算法指定操作及算法传参lambda表达式谓词lambda介绍lambda传参捕获列表用lambda改写算法lambda捕获和返回值捕获引用捕获隐式捕获显式捕获可变lambda指定lambda返回类型 概述 对于顺序容器的操作,我们前面介绍了添加,删除,大小操作,但是我们还有比如查找,排序等操作,这些操作是基于算法的,C++给我们提供了...

强者之路 1060

C++ Primer 初识泛型算法

一种保证算法有足够元素空闰来容纳输出数据的方法是使用撒入迭代器(insert iterator)。插入迭代器是一种向容器中添加元素的迭代器。通常情况,当我们通过一个迭代器向容器元素赋值时,值被赋予迪代器指向的元素。而当我们通过一个插入迭代器赋值时,一个与赋值号右侧值相等的元素被添加到容器中。但是,为了展示如何用算法向容器写入数据,我们现在将使用back_inserter,它是定义在头文件iterator中的一个函数。back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迪代器。

专注于C/C++编程语言的博客,如果读者对C/C++语言有任何需要咨询的可以私信联系! 1035
上一篇: 泛型算法——只读算法(一)
下一篇: 泛型算法——只读算法(三)
taciturn丶
博客等级 码龄9年 471粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taciturn丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值