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

2023/9/30 18:17:51
定义于头文件 <algorithm>

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

创建某范围的不含连续重复元素的副本

std::unique_copy
template< class InputIt, class OutputIt >

OutputIt unique_copy( InputIt first, InputIt last,

                      OutputIt d_first );
(1)(C++20 前)
template< class InputIt, class OutputIt >

constexpr OutputIt unique_copy( InputIt first, InputIt last,

                                OutputIt d_first );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last,

                        ForwardIt2 d_first );
(2)(C++17 起)
template< class InputIt, class OutputIt, class BinaryPredicate >

OutputIt unique_copy( InputIt first, InputIt last,

                      OutputIt d_first, BinaryPredicate p );
(3)(C++20 前)
template< class InputIt, class OutputIt, class BinaryPredicate >

constexpr OutputIt unique_copy( InputIt first, InputIt last,

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

ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last,

                        ForwardIt2 d_first, BinaryPredicate p );
(4)(C++17 起)

从范围 [first, last) 复制元素到始于 d_first 的另一范围,使得无连续的相等元素。只复制每组等价元素的首元素。

1) 用 operator== 比较元素。

3) 用给定的二元谓词 p 比较元素。

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

参数

first, last-要处理的元素范围
d_first-目标范围的起始
policy-所用的执行策略。细节见执行策略。
p-若元素应被当做相等则返回 ​true 的二元谓词。

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

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

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

类型要求
- InputIt 必须满足遗留输入迭代器 (LegacyInputIterator) 的要求。
- OutputIt 必须满足遗留输出迭代器 (LegacyOutputIterator) 的要求。
- ForwardIt1, ForwardIt2 必须满足遗留向前迭代器 (LegacyForwardIterator) 的要求。
- 解引用 InputIt 结果的类型必须满足可复制赋值 (CopyAssignable) 的要求。若 InputIt 不满足遗留向前迭代器 (LegacyForwardIterator) 。
- 解引用 InputIt 结果的类型必须满足可复制构造 (CopyConstructible) 的要求。若 InputIt 或 OutputIt 均不满足遗留向前迭代器 (LegacyForwardIterator) ,或若 InputIt 不满足遗留向前迭代器 (LegacyForwardIterator) 且 InputIt 的 value_type 异于 OutputIt 。

返回值

指向最后被写入元素后一元素的输出迭代器。

复杂度

对于非空范围,准确应用 std::distance(first, last) - 1 次对应谓词。

异常

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

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

注意

若 InputIt 满足遗留向前迭代器 (LegacyForwardIterator) ,则此函数重读取输入,以检测重复。

否则,若 OutputIt 满足遗留向前迭代器 (LegacyForwardIterator) ,且 InputIt 的 value_type 与 OutputIt 的相同,则此函数比较 *d_first*first

否则,此函数比较 *first 和局部元素副本。

对有 ExecutionPolicy 的重载,若 ForwardIterator1 的值类型非可复制构造 (CopyConstructible) 且可复制赋值 (CopyAssignable) 则有性能开销。

 调用示例

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>

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)
    {
        return x == cell.x && y == cell.y;
    }

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

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

int main()
{
    auto func1 = [](Cell & cell, const Cell & t)
    {
        cell += t;
        return cell;
    };

    Cell cell{99, 100};
    Cell t{2, 3};
    auto func2 = std::bind(func1, cell, t);

    vector<Cell> cells(8);
    vector<Cell> tcells(8);

    std::generate(cells.begin(), cells.begin() + cells.size() / 3, func2);
    std::generate(cells.begin() + cells.size() / 3, cells.end(), func2);
    std::sort(cells.begin(), cells.end());//排序
    std::cout << "original :            ";
    std::copy(cells.begin(), cells.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

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

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

    tcells.resize(8);
    std::cout << "func original :       ";
    std::copy(cells.begin(), cells.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "func unique_copy :    ";
    std::unique_copy(cells.begin(), cells.end(), tcells.begin(), func3);
    std::copy(tcells.begin(), tcells.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    return 0;
}

输出


http://www.jnnr.cn/a/127374.html

相关文章

MybatisPlus乐观锁悲观锁和分页查询逻辑删除

目录 乐观锁和悲观锁 测试乐观锁单线程成功的例子 乐观锁多线程失败案例 查询操作 分页查询 删除操作 删除单个 删除多个 按map删除 逻辑删除 乐观锁和悲观锁 乐观锁&#xff1a;顾名思义十分乐观&#xff0c;他总是认为不会出现问题&#xff0c;无论干什么都不去上锁&a…

【自定义字符串排序】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定两个字符串 order 和 s 。order 的所有单词都是 唯一 的&#xff0c;并且以前按照一些自定义的顺序排序。 对 s 的字符进行置换&#xff0c;使其与排序的 order 相匹配。更具体地说&#xff0c;…

Spring AOP案例:百度网盘密码数据兼容处理 与 SpringAOP总结

目录 需求与分析&#xff1a; 代码实现&#xff1a; AOP总结&#xff1a; 需求与分析&#xff1a; 需求&#xff1a;对百度网盘分享连接输入密码时尾部多输入的空格进行处理 分析: 1.在业务方法执行前对所有的输入参数进行格式处理——trim&#xff08;&#xff09;&#xf…

在vue2和vue3中Vuex的使用及其持久化存储,mutation和actions的区别

就像官网所说的 vuex 就是一个用来做状态管理的库,它就像一个仓库一样存了许多的状态和方法 哪个组件使用,我们就直接在那个组件中引用就行. 在vuex中,有state,getters,mutations,actions,modules这些属性 state,类似于组件中的data,用来存放数据 getters,类似于组件中的…

【南京大学操作系统(蒋炎岩)】(五) 并发 Bug 和应对

【南京大学jyy操作系统】&#xff08;&#xff09; 文章目录并发 Bug 和应对应对 Bug 的方法并发 Bug&#xff1a;死锁 (Deadlock)并发 Bug&#xff1a;数据竞争 (Data Race)更多类型的并发 Bug应对并发 Bug 的方法总结操作系统的状态机模型前言学习链接 &#xff1a; 链接点击…

【最简便方法】element-plus/element-ui走马灯配置图片以及图片自适应

首先展示官网给的模板 <template><el-carousel :interval"4000" type"card" height"200px"><el-carousel-item v-for"item in 6" :key"item"><h3 text"2xl" justify"center">…

【Java进阶篇】第二章 Java数组(下篇) 二维数组

文章目录1、二维数组2、二维数组元素的读和改3、二维数组的遍历4、数组工具类原理&#xff08;java.util.Arrays)5、Array工具类的使用1、二维数组 二维数组是一个特殊的一维数组&#xff0c;特殊在这个一维数组当中的每一个元素都是一维数组 System.out.println(a.length); /…

Java数据结构 | 模拟实现优先级队列

目录 一、前言 二、堆模拟实现优先级队列 2.1 堆的概念 2.2 堆的性质 2.3 堆的存储方式 2.4 堆的创建 一、前言 在前面我们学习过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队…

SpringMVC实现文件的上传(CommonsMultipartResolver和StanderServletMultipartResolver)

一定要足够优秀才能堵住悠悠众口。 文件上传功能在SpringMVC中有两种方法&#xff08;两种不同的处理器&#xff09; 这篇文章我们将通过这两种方法来实现文件上传功能 1&#xff1a;CommonsMultipartResolver 创建一个新的Maven项目并在项目中进行基础的环境配置 Maven项目基…

java毕业设计成品基于JavaWeb实现疫情环境下校园宿舍|寝室管理系统[包运行成功]

&#x1f345;源码下载地址&#xff1a;https://download.csdn.net/download/itrjxxs_com/221724377&#x1f345; 一、项目介绍 java毕业设计计算机毕设项目之JavaWeb项目《疫情环境下校园宿舍管理系统》_哔哩哔哩_bilibilijava毕业设计计算机毕设项目之JavaWeb项目《疫情环…

如何在 Android Studio 中重命名软件包名称

如何在 Android Studio 中重命名软件包名称 前言 在发布的时候需要修改包名&#xff0c;今天说下如何在 Android Studio 中轻松的重命名软件包名称。 正文 只需要修改 程序 app id 就行了&#xff0c;你不需要手动修改 Gradle 文件&#xff0c;按下面步骤操作。 操作步骤 右键单…

新版TCGA表达矩阵1行代码提取2.0版

配合视频教程使用更佳&#xff1a;【1行代码提取6种TCGA表达矩阵和临床信息】 https://www.bilibili.com/video/BV12R4y197Ne/?share_sourcecopy_web&vd_sourceabc21f68a9e2a784892483fd768dbafa 之前写了一个脚本&#xff0c;可以让大家1行代码提取6种类型的表达矩阵以及…

二进制数据传输几个关键项记录——大小端、BCD码、CRC16校验

二进制数据传输几个关键项记录——大小端、BCD码、CRC16校验 1. 背景 最近公司项目业务处理上需要频繁对二进制数据进行&#xff0c;期间涉及到很多字节顺序、BCD码、校验码等内容&#xff0c;时间长一些又给忘记&#xff0c;还要再查一次。 所以这里统一做个备忘&#xff0…

Java_类和对象

目录 1.什么是面向对象 2. 类定义和使用 (1)简单认识类 (2)类的定义格式 3. 类的实例化 (1)什么是实例化 (2)类和对象的说明 总结&#xff1a; 注意3点&#xff1a; 1.当一个引用赋值为null的时候&#xff0c;代表这个引用不指向任何对象&#xff01; 2.引用能否指向引…

【KEIL4.74】社区版安装与激活详细步骤教程

【KEIL4.74】社区版安装与激活详细步骤教程 文章目录 1.登录 Arm Keil | Log in &#xff0c;注册好后登录&#xff0c;复制第五项的PSN编号. 2.登录 此网站MDK-ARM Version 4.74 Product Update &#xff0c;完整填写问卷调查并提交。 3.跳转到网站内可下载KEIL4.74版本…

Centos7 DockerDocker-Compose安装教程

整合两篇文章备忘 原文链接如下&#xff1a; https://cloud.tencent.com/developer/article/1701451 https://www.zhuawaba.com/post/84 一、安装前必读 在安装 Docker 之前&#xff0c;先说一下配置&#xff0c;我这里是Centos7 Linux 内核&#xff1a;官方建议 3.10 以上&a…

delphi 中几种多线程操作方式

在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程。 主线程又程为UI线程。 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间&#xff0c;一个进程崩溃后&#xff0c;在保护模式下不会对其…

Python安装QT6,Pycharm设置designer,PySide6-uic和PySide6-rcc方法

#安装pyside6 pip install pyside6 #设置designer 程序路径&#xff1a;C:\Users\Administrator\AppData\Roaming\Python\Python311\site-packages\PySide6\designer.exe 工作目录&#xff1a;$FileDir$ #设置pyside6-uic 程序路径&#xff1a;C:\Users\Administrator\AppD…

第一个springBoot maven 项目

1. env: java 11 IntelliJ IDEA 2021.3.2 (Community Edition) 2. file->new project->Maven: pom.xml 需要导入的包&#xff1a;后面三个是jdk8升级到11后&#xff0c;可能会出错&#xff0c;需要用到的包 <parent><groupId>org.springframework.boot<…

java毕业设计成品基于JavaWeb酒店管理系统开发与设计[包运行成功]

&#x1f345;源码下载地址&#xff1a;https://download.csdn.net/download/itrjxxs_com/221724377&#x1f345; 一、项目介绍 java毕业设计计算机毕设项目之基于JavaWeb酒店管理系统开发与设计_哔哩哔哩_bilibilijava毕业设计计算机毕设项目之基于JavaWeb酒店管理系统开发…
最新文章