C++11标准模板(STL)- 算法(std::equal)

news2024/11/25 14:15:06
定义于头文件 <algorithm>

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。

确定两个元素集合是否是相同的

std::equal
template< class InputIt1, class InputIt2 >

bool equal( InputIt1 first1, InputIt1 last1,

            InputIt2 first2 );
(1)(C++20 前)
template< class InputIt1, class InputIt2 >

constexpr bool equal( InputIt1 first1, InputIt1 last1,

                      InputIt2 first2 );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

bool equal( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1,

            ForwardIt2 first2 );
(2)(C++17 起)
template< class InputIt1, class InputIt2, class BinaryPredicate >

bool equal( InputIt1 first1, InputIt1 last1,

            InputIt2 first2, BinaryPredicate p );
(3)(C++20 前)
template< class InputIt1, class InputIt2, class BinaryPredicate >

constexpr bool equal( InputIt1 first1, InputIt1 last1,

                      InputIt2 first2, BinaryPredicate p );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate >

bool equal( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1,

            ForwardIt2 first2, BinaryPredicate p );
(4)(C++17 起)
template< class InputIt1, class InputIt2 >

bool equal( InputIt1 first1, InputIt1 last1,

            InputIt2 first2, InputIt2 last2 );
(5)(C++14 起)
(C++20 前)
template< class InputIt1, class InputIt2 >

constexpr bool equal( InputIt1 first1, InputIt1 last1,

                      InputIt2 first2, InputIt2 last2 );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

bool equal( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1,

            ForwardIt2 first2, ForwardIt2 last2 );
(6)(C++17 起)
template< class InputIt1, class InputIt2, class BinaryPredicate >

bool equal( InputIt1 first1, InputIt1 last1,
            InputIt2 first2, InputIt2 last2,

            BinaryPredicate p );
(7)(C++14 起)
(C++20 前)
template< class InputIt1, class InputIt2, class BinaryPredicate >

constexpr bool equal( InputIt1 first1, InputIt1 last1,
                      InputIt2 first2, InputIt2 last2,

                      BinaryPredicate p );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate >

bool equal( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1,
            ForwardIt2 first2, ForwardIt2 last2,

            BinaryPredicate p );
(8)(C++17 起)

1,3) 如果范围 [first1, last1) 和范围 [first2, first2 + (last1 - first1)) 相等,返回 true ,否则返回 false

5,7) 如果范围 [first1, last1) 和范围 [first2, last2) 相等,返回 true ,否则返回 false

2,4,6,8) 同 (1,3,5,7) ,但按照 policy 执行。这些重载仅若 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 为 true 才参与重载决议。

两个范围相等的条件是:对于范围 [first1, last1) 内的每个迭代器 i , *i 等于 *(first2 + (i - first1)) 。重载形式 (1,2,5,6) 用 operator== 判定两个元素是否相等,而重载形式 (3,4,7,8) 用给定的谓词函数。

参数

first1, last1-进行比较的第一个范围
first2, last2-进行比较的第二个范围
p-若元素应被当做相等则返回 ​true 的二元谓词。

谓词函数的签名应等价于如下:

 bool pred(const Type1 &a, const Type2 &b);

虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 Type1Type2 的值,无关乎值类别(从而不允许 Type1 & ,亦不允许 Type1 ,除非 Type1 的移动等价于复制 (C++11 起))。
类型 Type1 与 Type2 必须使得 InputIt1 与 InputIt2 类型的对象在解引用后分别能隐式转换到 Type1 与 Type2 。 ​

类型要求
- InputIt1, InputIt2 必须满足遗留输入迭代器 (LegacyInputIterator) 的要求。

返回值

5-8) 如果范围 [first1, last1) 的长度不等于范围 [first2, last2) 的长度则返回 false 。

如果两个范围内的元素都相等,则返回 true 。

否则返回 false 。

注意

std::equal 不可应用到由 std::unordered_set 、 std::unordered_multiset 、 std::unordered_map 或 std::unordered_multimap 的迭代器构成的范围,因为即使此类容器存储相同的元素,在容器内元素存储的顺序也可能不同。

比较整个容器是否相等时,针对该容器的 operator== 重载通常是更好的选择。

复杂度

1,2) 最多 last1 - first1 次调用相应的谓词函数。

3,4) 最多 min(last1 - first1, last2 - first2) 次调用相应的谓词函数。
然而,若 InputIt1InputIt2 满足遗留随机访问迭代器 (LegacyRandomAccessIterator) 的要求,且 last1 - first1 != last2 - first2 则不调用谓词函数。

异常

拥有名为 ExecutionPolicy 的模板形参的重载按下列方式报告错误:

  • 若作为算法一部分调用的函数的执行抛出异常,且 ExecutionPolicy 为标准策略之一,则调用 std::terminate 。对于任何其他 ExecutionPolicy ,行为是实现定义的。
  • 若算法无法分配内存,则抛出 std::bad_alloc 。

可能的实现

版本一

template<class InputIt1, class InputIt2>
bool equal(InputIt1 first1, InputIt1 last1, 
           InputIt2 first2)
{
    for (; first1 != last1; ++first1, ++first2) {
        if (!(*first1 == *first2)) {
            return false;
        }
    }
    return true;
}

版本二

template<class InputIt1, class InputIt2, class BinaryPredicate>
bool equal(InputIt1 first1, InputIt1 last1, 
           InputIt2 first2, BinaryPredicate p)
{
    for (; first1 != last1; ++first1, ++first2) {
        if (!p(*first1, *first2)) {
            return false;
        }
    }
    return true;
}

版本三

template<class InputIt1, class InputIt2>
bool equal(InputIt1 first1, InputIt1 last1, 
           InputIt2 first2, InputIt2 last2 )
{
    if (distance(first1,last1) != distance(first2,last2)
        return false;
    for (; first1 != last1, first2 != last2; ++first1, ++first2) {
        if (!(*first1 == *first2)) {
            return false;
        }
    }
    return true;
}

版本四

template< class InputIt1, class InputIt2, class BinaryPredicate >
bool equal( InputIt1 first1, InputIt1 last1,
            InputIt2 first2, InputIt2 last2,
            BinaryPredicate p )
{
    if (distance(first1,last1) != distance(first2,last2)
        return false;
    for (; first1 != last1, first2 != last2; ++first1, ++first2) {
        if (!p(*first1, *first2)) {
            return false;
        }
    }
    return true;
}

调用示例

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
#include <time.h>

using namespace std;

struct Cell
{
    int x;
    int y;

    Cell &operator +=(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    bool operator <(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y < cell.y;
        }
        else
        {
            return x < cell.x;
        }
    }

    bool operator ==(const Cell &cell) const
    {
        return x == cell.x && y == cell.y;
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}

int main()
{
    srand((unsigned)time(NULL));;

    std::cout << std::boolalpha;

    auto func1 = []()
    {
        int n = std::rand() % 10 + 100;
        Cell cell{n, n};
        return cell;
    };

    // 初始化cells1
    vector<Cell> cells1(6);
    std::generate(cells1.begin(), cells1.end(), func1);

    // 打印cells1
    std::cout << "cells1:           ";
    std::copy(cells1.begin(), cells1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "is palindrome:    "
              << std::equal(cells1.begin(), cells1.begin() + cells1.size() / 2, cells1.rbegin())
              << std::endl;
    std::cout << std::endl;

    // 初始化cells2
    vector<Cell> cells2{{101, 101}, {102, 102}, {103, 103}, {103, 103}, {102, 102}, {101, 101}};

    std::cout << "cells2:           ";
    std::copy(cells2.begin(), cells2.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "is palindrome:    "
              << std::equal(cells2.begin(), cells2.begin() + cells2.size() / 2, cells2.rbegin())
              << std::endl;
    std::cout << std::endl;


    auto funcEqual = [](const Cell & a, const Cell & b)
    {
        return a.x == b.x && a.y == b.y;
    };

    // 初始化cells3
    vector<Cell> cells3(6);
    std::generate(cells3.begin(), cells3.end(), func1);

    // 打印cells3
    std::cout << "cells3:           ";
    std::copy(cells1.begin(), cells1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "is palindrome:    "
              << std::equal(cells3.begin(), cells3.begin() + cells3.size() / 2, cells3.rbegin(), funcEqual)
              << std::endl;
    std::cout << std::endl;

    // 初始化cells4
    vector<Cell> cells4{{105, 106}, {106, 107}, {108, 109}, {108, 109}, {106, 107}, {105, 106}};

    std::cout << "cells4:           ";
    std::copy(cells4.begin(), cells4.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "is palindrome:    "
              << std::equal(cells4.begin(), cells4.begin() + cells4.size() / 2, cells4.rbegin(), funcEqual)
              << std::endl;

    return 0;
}

输出

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手写Spring8(Aware感知容器变化)

文章目录目标设计思想项目结构一、实现1、定义标记接口2、容器感知类2.1、BeanFactoryAware2.2、BeanFactoryAware2.3、BeanNameAware2.4、ApplicationContextAware3、包装处理器(ApplicationContextAwareProcessor)4、注册 BeanPostProcessor5、感知调用操作二、测试1、事先准…

(附源码)springboo计算机专业大学生就业指南网 毕业设计 061355

计算机专业大学生就业指南网 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对学生就业管理等…

Premiere Pro 快捷键大全(2023版)

说明&#xff1a;为避免篇幅过大&#xff0c;本文快捷键是基于 Windows 系统 Pr 2023 版本的。Mac系统下的快捷键可按以下方式进行对应&#xff1a;Ctrl→Command&#xff0c;Alt→Option。有不能对应的&#xff0c;本文会给出说明。◆ ◆ ◆媒体相关新建序列&#xff1a;Ctrl …

创建Series()对象--pandas

1. 函数功能 产生带有标签(索引)的一维数组&#xff0c;Series对象中的数据可以是任意类型&#xff08;整型、字符串、浮点型、python对象等&#xff09; 2. 函数语法 pandas.Series(dataNone, indexNone, dtypeNone, nameNone, copyFalse, fastpathFalse)3. 函数参数与示例…

猿如意初体验!赞一个。

目录 功能一&#xff1a;chatGPT 功能二、对 “效率工具”的试体验&#xff01; 功能三&#xff1a;教程文档 最后总结 猿如意传送门猿如意下载地址&#xff1a;猿如意-程序员的如意兵器,工具代码,一搜就有 猿如意使用了几次了&#xff0c;今天来想分享一下我对于猿如意的…

工程复现 -- SiamMOT

工程复现 – SiamMOT 先赞后看&#xff0c;养成好习惯&#xff0c;感谢您的理解与支持&#xff01; 参考&#xff1a; 1. siam-mot源码地址 2. SiamMOT 论文地址 3. SiamMOT 论文解析 简单介绍 SiamMOT&#xff08;SiamMOT: Siamese Multi-Object Tracking&#xff09;是…

微服务框架 SpringCloud微服务架构 服务异步通讯 53 MQ 集群 53.5 仲裁队列【SpringAMQP】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯53 MQ 集群53.5 仲裁队列【SpringAMQP】53.5.1 仲裁队列53 MQ 集群 53.5 仲裁队列【SpringAM…

Jvm学习笔记

&#x1f3b6; 文章简介&#xff1a;Jvm学习笔记 &#x1f4a1; 创作目的&#xff1a;Jvm学习笔记 ☀️ 今日天气&#xff1a;天气很好 &#x1f4dd; 每日一言&#xff1a;乾坤琉璃色&#xff0c;碧宇凝清光。 文章目录类文件结构详解一 概述二 Class 文件结构总结2.1 魔数&am…

工程机械部件的大尺寸空间精度检测仪器

工程机械作为工程建设中的重要工具&#xff0c;施工过程中长期承受各种外力&#xff0c;因此对各结构件质量要求很高&#xff0c;检测十分严格&#xff0c;通常要求的公差在0.1mm&#xff5e;0.2mm以内。工程机械部件外形尺寸及重量通常较大&#xff0c;常规仪器无法有效满足检…

【Linux权限管理】

The secret of getting ahead is getting started. 目录 1 Linux权限的概念 2 文件访问者的分类&#xff08;人&#xff09; 3 文件类型和访问权限&#xff08;事物属性&#xff09; chmod chown: chgrp: 4 文件掩码 umask 5 目录的权限 6 粘滞位 7 权限的总结 1 Linu…

【瑕疵检测】瓶盖瑕疵检测【含Matlab源码 730期】

⛄一、简介 文中将图像预处理与边缘检测相结合对瓶盖瑕疵进行检测, 先使用直方图规定化的方法对图像做出修正与增强, 再利用中值滤波的方法消除图像孤立的噪声点;Canny算子快速分辨出瓶盖瑕疵, 再利用采用Otsu阈值方法求取自适应阈值自动选择并提取瑕疵。 1 图像预处理 在特征…

Mac 使用 brew 安装 mysql

最近需要用到 MySQL 来开发项目&#xff0c;所以在 Mac 配置了下 MySQL 的环境。 1、使用 brew install mysql 安装 MySQL 安装完毕后会有以下提示信息&#xff0c;告诉我们初始安装好后 root 账户没有密码&#xff0c;只需要输入 mysql -uroot就能连接运行MySQL。 那咱们输入 …

模板引擎:ftl文件生成word

wshanshi&#xff1a;总结记录…便于回顾… 一、什么是FreeMarker FreeMarker 是一个用 Java 语言编写的模板引擎&#xff0c;基于模板来生成文本输出。 FreeMarker的原理&#xff1a;模板数据模型输出&#xff0c;模板只负责数据在页面中的表现&#xff0c;不涉及任何的逻辑代…

设计模式之组合模式

Composite design pattern 组合模式的概念、组合模式的结构、组合模式的优缺点、组合模式的使用场景、组合模式的实现示例、组合模式的源码分析 1、组合模式的概念 组合模式&#xff0c;即部分整体模式&#xff0c;是用于把一组相似的对象当做一个单一个的对象。组合模式依据树…

C#语言实例源码系列-身份证验证

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

【车载开发系列】UDS诊断---数据传输($0x36)

【车载开发系列】UDS诊断—数据传输&#xff08;$0x36&#xff09; UDS诊断---数据传输&#xff08;$0x36&#xff09;【车载开发系列】UDS诊断---数据传输&#xff08;$0x36&#xff09;一.概念定义二.报文格式1&#xff09;请求报文2&#xff09;肯定响应3&#xff09;否定响…

FL Studio21最新中文公测版下载及新功能介绍

FL Studio水果21现已推出&#xff0c;提供更快、更精确的音频编辑&#xff0c;coco玛奇朵升级后的DAW为用户提供了更多的内容发现和改进的界面。 Image-Line发布了FL Studio 21&#xff0c;称其可以实现更快、更精确的音频编辑&#xff0c;以及对整个DAW的更多控制。 期待已久…

【毕业设计_课程设计】基于SSM的实验室管理系统(源码+论文)

文章目录0 项目说明1 研究目的2 研究方法3 项目使用4 研究结论5 论文目录6 项目源码0 项目说明 基于SSM的实验室管理系统 提示&#xff1a;适合用于课程设计或毕业设计&#xff0c;工作量达标&#xff0c;源码开放 1 研究目的 基于B/S模式的实验室管理系统&#xff0c;它所覆…

Linux命令行笔记-00 综述

文章目录1 Linux命令行简介1.1 Linux命令行的分类1.1.1 根据系统中作用来分类1.1.2 根据对象来分类2 Linux命令行解释器2.1 命令行解释器shell2.1.1 核心程序2.1.2 公用程序shell2.1.3 用户的默认shell2.1.4 shell如何工作2.2 Shell发展历史2.3 shell版本的差异2.3.1 C shell2.…

云原生----什么是云原生

【原文链接】云原生----什么是云原生 文章目录1. 云原生的概念2. 云原生的四要素3. 云原生的关键目标什么是云原生&#xff1f;这里将从云原生的概念、云原生的四要素、云原生关键目标等方面介绍。1. 云原生的概念 云原生应用时面向云而设计的应用&#xff0c;在使用云原生技术…