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

2023-11-02

定义于头文件 <algorithm>

 

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

旋转范围中的元素顺序

std::rotate

template< class ForwardIt >
void      rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );

(1) (C++11 前)

template< class ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );

(C++11 起)
(C++20 前)
template< class ForwardIt >

constexpr ForwardIt

          rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt >

ForwardIt rotate( ExecutionPolicy&& policy,

                  ForwardIt first, ForwardIt n_first, ForwardIt last );
(2) (C++17 起)

1) 进行元素范围上的左旋转。

具体而言, std::rotate 交换范围 [first, last) 中的元素,方式满足元素 n_first 成为新范围的首个元素,而 n_first - 1 成为最后元素。

此函数的前提条件是 [first, n_first)[n_first, last) 为合法范围。

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

参数

first - 原范围的起始
n_first - 应出现在旋转后范围起始的元素
last - 原范围的结尾
policy - 所用的执行策略。细节见执行策略。
类型要求
- ForwardIt 必须满足值可交换 (ValueSwappable) 和 遗留向前迭代器 (LegacyForwardIterator) 的要求。
- 解引用 ForwardIt 结果的类型必须满足可移动赋值 (MoveAssignable) 和可移动构造 (MoveConstructible) 的要求。

返回值

(无)

(C++11 前)

指向 first 指向的元素所在的新位置的迭代器。等于 first + (last - n_first)

(C++11 起)

复杂度

firstlast 间的距离成线性。

异常

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

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

可能的实现

template<class ForwardIt>
ForwardIt rotate(ForwardIt first, ForwardIt n_first, ForwardIt last)
{
   if(first == n_first) return last;
   if(n_first == last) return first;
 
   auto read      = n_first;
   auto write     = first;
   auto next_read = first; // "read" 撞击 "last" 时的读取位置
 
   while(read != last) {
      if(write == next_read) next_read = read; // 跟踪 "first" 所至
      std::iter_swap(write++, read++);
   }
 
   // 旋转剩余序列到位置中
   (rotate)(write, next_read, last);
   return write;
}

调用示例

#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;
    }
};

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);
    std::generate(cells.begin(), cells.end(), func2);
    std::cout << "original :            ";
    std::copy(cells.begin(), cells.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::rotate(cells.begin(), cells.begin() + cells.size() / 3, cells.end());
    std::cout << "simple rotate left :  ";
    std::copy(cells.begin(), cells.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::rotate(cells.rbegin(), cells.rbegin() + cells.size() / 3, cells.rend());
    std::cout << "simple rotate right : ";
    std::copy(cells.begin(), cells.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::rotate(cells.rbegin(), cells.rbegin() + cells.size() / 3, cells.rend());
    std::cout << "simple rotate right : ";
    std::copy(cells.begin(), cells.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    return 0;
}

输出

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

C++11标准模板(STL)- 算法(std::rotate) 的相关文章

随机推荐

  • 一款非常萌的桌面工具---bongo cat mver0.1.6 附使用教程

    bongo cat mver是一款画风非常萌的桌面工具 由B站用户原创制作 具有人性化UI设置界面 可用于装饰视频或直播 能够根据鼠标 键盘操作做出相应的动作 超级可爱 该软件是以小猫的形式展现 共有四种模式供用户选择 包括键鼠 绘画 手柄
  • 5G+AIoT“零碳”解决方案

    碳交易 目前被认为是用市场机制调整碳排放的有效工具 通过有限的碳排放量分配 政府部门可以对碳排放配额进行总量控制 使纳入市场的控排企业受到碳排放限额的限制 排放量少于配额的企业可将多余的配额出来销售 反之超配额的企业 就需要到市场上去购买排
  • debian linux vnc,在Debian 9上,如何安装和配置VNC

    本教程描述了如何在Debian 9上安装和配置VNC服务器 我们还将向您展示如何创建SSH隧道并安全地连接到VNC服务器 先决条件 在继续本教程之前 请确保您以具有sudo特权的用户身份登录 安装桌面环境 你的Debian server可能
  • IOS9中出现的错误

    1 Bitcode 错误提示 ld Applications Cocos frameworks cocos2d x 3 8 1 prebuilt ios libcocos2d iOS a CCEAGLView ios o does not
  • vue3之后台管理系统权限

    权限概括 后台管理系统中权限是不可少的一部分 例如 页面权限 菜单权限 按钮权限 路由权限等 文章目录 权限概括 定义权限 一 用户登录和认证 二 前端路由控制 三 菜单权限 四 数据级别的权限控制 五 前端界面的反馈 六 按钮权限 实现思
  • java+selenium3

    一 环境搭建 1 JDK安装 配置环境变量 2 selenium下载 3 测试Demo public static void main String args throws InterruptedException todo System
  • 华为机试—字符串处理专题

    文章目录 leetbook 字符串 125 验证回文串 5 最长回文子串 131 分割回文串 见回溯 HJ1计算字符串最后一个单词的长度 单词以空格隔开 HJ2输出输入字符串中含有该字符的个数 HJ4字符串分隔 连续输入多行字符串所以用ge
  • 硬件基础元器件【1.电阻篇】

    文章目录 1 电阻 1 1 电阻的作用 1 2 电阻选型要点 1 3 电阻的主要使用场景 1 3 1 上 下拉电阻 上下拉电阻作用 阻值选择原则 1 3 2 MOS管栅极驱动电阻 1 3 3 电源反馈电阻 1 3 4 晶振并联电阻 1 3
  • 算法(C++):加一

    算法 C 加一 题目难度 简单 题目描述 给定一个由 整数 组成的 非空 数组所表示的非负整数 在该数的基础上加一 最高位数字存放在数组的首位 数组中每个元素只存储单个数字 你可以假设除了整数 0 之外 这个整数不会以零开头 示例1 输入
  • centos7下docker中mysql大小写敏感相关问题解决方案

    因为linux下的mysql默认区分大小写 而windows下的mysql默认不区分 所以关联的时候 有时候会出问题 所以我们要取消linux小的区分大小写 目录 一 mysql大小写解决方案 1 启动docker 2 运行mysql容器
  • zabbix监控TCP连接状态

    一 zabbix监控TCP连接状态 1 取到TCP连接状态的值 root web01 netstat antp awk NR gt 2 print 6 grep TIME WAIT wc l 可以取到TIME WAIT的个数 依次类推 可以
  • linux安装mysql-8.0.11出现错误

    linux安装mysql 8 0 11出现 2020 04 16T11 47 06 723455Z 0 Warning MY 011070 Server Disabling symbolic links using skip symboli
  • java基础经典题——猴子吃桃

    作为学java循环的经典问题 猴子第一天摘了若干个桃子 当即吃了一半 还不解馋 又多吃了一个 第二天 吃剩下的桃子的一半 还不过瘾 又多吃了一个 以后每天都吃前一天剩下的一半多一个 到第10天想再吃时 只剩下一个桃子了 问第一天共摘了多少个
  • Ubuntu系统中如何删除一个用户

    1 打开终端命令行 运用userdel命令删除指定的用户 注意要加sudo权限指令 如下图 sudo userdel ascend 2 在删除的时候一定注意是在管理员目录下的 普通的用户是没有这个权限的 3 删除指令执行完了以后怎么判断是否
  • linux桌面小程序开发日记4(pyqt5+yolov5)

    linux桌面小程序开发日记4 修改detect py文件 让yolov5连接摄像头 同时输出识别出来的内容 最后一篇博客地址 https blog csdn net Liuchengzhizhi article details 12369
  • 论穷举法破解0到6位数登录密码的可行性

    0到6位数密码含数字 字母大小写 英文符号有537412247190种可能性 千亿数量级 3998 410GB 在局域网网速 个人台式电脑情况下 java代码 httpclient 访问路由器网址一次要414ms 如果只访问头信息的话会快1
  • ROI pooling 和 ROI Align详解

    ROI Align 是在Mask RCNN这篇论文里提出的一种区域特征聚集方式 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配 mis alignment 的问题 实验显示 在检测测任务中将 ROI Pooling 替换为
  • 华为OD机试(Java,JS,Python,C++)-Excel单元格数值统计

    Excel单元格数值统计 时间限制 2s 空间限制 256MB 限定语言 不限 题目描述 Excel工作表中对选定区域的数值进行统计的功能非常实用 仿照Excel的这个功能 请对给定表格中选中区域中的单元格进行求和统计 并输出统计结果 为简
  • innodb事务实现

    事务的特性 ACID 事务的类别 事务实现 redo redoLog buffer 的格式 undo 更新主键 purge group commit 因为上层的binlog和底层的redolog要保持一致 所以 事务控制语句 事务隔离级别
  • C++11标准模板(STL)- 算法(std::rotate)

    定义于头文件