partition/stable_partition详解

2023-05-16

Partition:将满足条件的元素向前移动.

// TEMPLATE FUNCTION partition

template<class _BidIt,

class _Pr> inline

_BidIt _Partition(_BidIt _First, _BidIt _Last, _Pr _Pred)

{ // move elements satisfying _Pred to beginning of sequence

for (; ; ++_First)//最外层循环是一次往后面找元素

{ // find any out-of-order pair

for (; _First != _Last && _Pred(*_First); ++_First)//找到使得_Pred为false的元素

; // skip in-place elements at beginning

if (_First == _Last)

break; // done

for (; _First != --_Last && !_Pred(*_Last); )//找到是的_Pred为true的元素.

; // skip in-place elements at end

if (_First == _Last)

break; // done

_STD iter_swap(_First, _Last); // swap out-of-place pair and loop

//经过两个内循环的查找,前者是的_Pred为false,后者使得_Pred为true的元素已经找到,并交换彼此

}

return (_First);

}

需要注意的一点:vs2010stl实现方式中,很喜欢使用if( -- iter )/for(_First != --_Last)这类的表达式,这类表达式的有点是代码量少,程序整洁,但是缺点就是容易造成语义判断错误,比如--iter,即使if判断失败iter也减一操作.

Stable_partition:将满足条件的元素向前移动.(但不改变初始状态的相对顺序)

// TEMPLATE FUNCTION stable_partition

template<class _BidIt,

class _Pr,

class _Diff,

class _Ty> inline

_BidIt _Stable_partition(_BidIt _First, _BidIt _Last, _Pr _Pred,

_Diff _Count, _Temp_iterator<_Ty>& _Tempbuf)

{ // partition preserving order of equivalents, using _Pred

if (_Count == 0)

return (_First);

else if (_Count == 1)

return (_Pred(*_First) ? _Last : _First);

else if (_Count <= _Tempbuf._Maxlen())

{ // temp buffer big enough, copy right partition out and back

_BidIt _Next = _First;

for (_Tempbuf._Init(); _First != _Last; ++_First)

if (_Pred(*_First))

*_Next++ = _Move(*_First);

else

*_Tempbuf++ = _Move(*_First);

_Move(_Tempbuf._First(), _Tempbuf._Last(), _Next); // copy back

return (_Next);

}

else

{ // temp buffer not big enough, divide and conquer

_BidIt _Mid = _First;

_STD advance(_Mid, _Count / 2);

_BidIt _Left = _Stable_partition(_First, _Mid, _Pred,

_Count / 2, _Tempbuf); // form L1R1 in left half

_BidIt _Right = _Stable_partition(_Mid, _Last, _Pred,

_Count - _Count / 2, _Tempbuf); // form L2R2 in right half

_Diff _Count1 = 0;

_Distance(_Left, _Mid, _Count1);

_Diff _Count2 = 0;

_Distance(_Mid, _Right, _Count2);

return (_Buffered_rotate(_Left, _Mid, _Right,

_Count1, _Count2, _Tempbuf)); // rotate L1R1L2R2 to L1L2R1R2

}

}

这里涉及到另外一个类:_Temp_iterator,有涉及到_Move这个函数.

_Move没有看懂.想看看源码剖析,结果发现里面并没有找到这个函数的实现方式.再一次对源码剖析感到失望.

_Temp_iterator这个类不知道实际功能是做什么.

暂时就过这个函数.

举例:

int main()

{

vector<int> vecInt;

for ( int i = 1;i <= 9;++ i )

{

vecInt.push_back( i );

}

partition( vecInt.begin(),vecInt.end(),bind2nd( modulus<int>(),2 ) );

copy( vecInt.begin(),vecInt.end(),ostream_iterator<int>( cout," " ) );

cout<<"\nstable_partition:\n";

stable_partition( vecInt.begin(),vecInt.end(),bind2nd( modulus<int>(),2 ) );

copy( vecInt.begin(),vecInt.end(),ostream_iterator<int>( cout," " ) );

system( "pause" );

return 0;

}

 

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

partition/stable_partition详解 的相关文章

  • 深入linux下文件系统磁盘Disk,分区Partition,挂载Mount

    目录 Linux 分区简介挂载点目录简介实战分区挂载临时挂载永久挂载 xff1a 开机自动挂载添加硬盘 amp 分区 amp 挂载loop device 回环设备loop mount绑定式挂载 bind mount 重新挂载 remount
  • partition/stable_partition详解

    Partition 将满足条件的元素向前移动 TEMPLATE FUNCTION partition template lt class BidIt class Pr gt inline BidIt Partition BidIt Firs
  • AI画图 Ubuntu 20.04.5 LTS x86_64 Docker stable diffusion webui 及 http api接口

    资源 Docker镜像 docker pull darkroot1234 ayanami latest 参考地址 xff1a docker一键运行stable diffusion webui xff0c 常用插件和功能完备 xff0c 获得
  • AI Stable Diffusion Prompt参数【一】

    AI Stable Diffusion Prompt参数 一 配置场景1 草丛里的女性promptNegative Prompt结果 场景2 雨中披头散发的女孩promptNegative Prompt结果 场景3 一个女孩和她的朋友在逛街
  • [Linux,AI绘画]搭建Stable-Diffusion

    最近的AI绘画很火 我们也来搭建一个 在linux下安装Stable Diffusion 1 首先我们下载或者克隆Stable Diffusion Webui 大概3MB git clone https github com AUTOMAT
  • [Linux容器]手把手搭建Stable-Diffusion容器

    最近的AI绘画可谓是特别火呀 这一期带大家使用容器搭建Stable Diffusion 1 首先我们安装Docker Debian sudo apt update amp amp sudo apt install y docker io R
  • WSL2运行stable-diffsuion容器

    首先安装wsl2 debian发行版 更新源安装docker sudo sed i 39 s deb debian org mirrors tuna Tsinghua edu cn 39 etc apt sources list amp a
  • greenplum partition table

    greenplum 分区表 xff0c 索引 greenplum 分区按照类型可以分为 列表分表 create table gh par list id1 integer id2 varchar 10 distributed by id1
  • stable diffusion的使用

    文章目录 1 文生图1 1 mountains and trees and gree1 2 three dogs1 3 cats1 4 three lovely cats1 5 beautiful girl1 6 机器猫1 7 卡通图像生成
  • 软件版本中的release,stable,alpha,beta,pre,snapshot

    转自 xff1a https www jianshu com p aefe0453d081 我们在下载软件会遇到诸如release stable alpha beta pre current eval rc snapshot等版本 xff0
  • partition/stable_partition详解

    Partition 将满足条件的元素向前移动 TEMPLATE FUNCTION partition template lt class BidIt class Pr gt inline BidIt Partition BidIt Firs
  • ALDS1_2_C:Stable Sort

    题目链接 xff1a ALDS1 2 C Stable Sort 题目概要 xff1a 扑克牌中存在数字相同而花色不同的情况 xff0c 该题需要利用扑克牌这一特性来比较两种排序 xff1a 冒泡排序 选择排序 xff08 题中给出伪代码
  • Hive - truncate partition、drop partition 区别

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Hive 有两种方法删除指定parition的数据 xff1a truncate partition drop parition 功能 xff1a 两者都用于删除数据 xf
  • group by与partition by用法

    本文采用Oracle数据库测试 xff0c 前4个查询为一组 xff0c 后2个查询为一组 xff0c 每组前面的查询是为了推出最后的查询 创建表 xff0c 为了简化处理 xff0c 字段类型都采用varchar create table
  • 按词汇顺序查找总和为给定数字的千组

    较大的数字可以采用逗号格式 以便更容易地分为三个一组 例如 1050 1 050 and 10200 10 200 每三组的总和为 1050 1 050 gives 1 50 51 10200 10 200 gives 10 200 210
  • Cassandra 存储桶拆分以调整分区大小

    我对 Cassandra 很陌生 我刚刚通过 Datastax 课程学习了它 但我在此处或互联网上没有找到足够的有关存储桶的信息 并且在我的应用程序中我需要使用存储桶来拆分数据 我有一些工具可以进行很多测量 并且每天拆分测量 时间戳作为分区
  • 在hive中向外部表添加分区需要花费大量时间

    我想知道向外部表添加分区的最佳方法是什么 我在 hive 的 S3 上有一个外部表 分区为 车辆 日期 小时 现在 可以在一天中的任何时间添加新车辆 并且有些车辆在一天中的几个小时或几天内没有数据 几种可能的解决方案 msck修复表 需 要
  • 在 Linux 上用 C++ 移动文件的更快方法

    我正在尝试使用 C 在 Linux 上移动文件 问题是 源文件和目标文件夹可能位于不同的分区 所以我不能简单地移动文件 好的 我决定复制该文件并删除旧文件 bool copyFile string source string destina
  • 基于排序的分区(如快速排序)

    这是一道面试题 给定一个包含 3 种对象白色 红色 黑色的数组 应该实现数组的排序 使其看起来如下 白色 黑色 红色 面试官说 你不能使用计数排序 他的提示是考虑一些与快速排序相关的技术 所以我建议使用类似于快速排序分区的分区 他只要求只使
  • 使用包含单行分区的 Cassandra 表是一种不好的做法吗?

    假设我有一张这样的桌子 CREATE TABLE request transaction id text request date timestamp data text PRIMARY KEY transaction id 据我了解 tr

随机推荐

  • sqli-labs环境搭建

    sqli labs环境搭建 链接 xff1a https www fujieace com penetration test sqli labs ec html
  • python打印等腰三角形

    d 61 int input 39 enter an int 39 l 61 39 39 2 d 1 d 初始化列表 for i in range d l i 61 list l i 字符串转列表 x 61 i y 61 0 x 61 d
  • 实战|如何消除又臭又长的if...else判断更优雅的编程?

    最近在做代码重构 xff0c 发现了很多代码的烂味道 其他的不多说 xff0c 今天主要说说那些又臭又长的if else要如何重构 在介绍更更优雅的编程之前 xff0c 让我们一起回顾一下 xff0c 不好的if else代码 一 又臭又长
  • 最新版Ubuntu 17.10与Windows双系统安装、配置与美化教程(转载)

    感谢原创 xff0c 原文地址 http www jianshu com p 62d947731401 TOC 本教程基于Ubuntu 17 10 xff0c 但是除了下面的Gnome插件部分 xff0c 同时也支持Ubuntu16以上的几
  • Win8.1系统下VirtualBox的各种网络配置方法——Bridged networking

    概述配置仅界面设置桥接到无线网络接口与桥接到有线网络接口的网络相比不同操作系统下桥接网络的缺点 概述 VirtualBox使用主机系统上的一个设备驱动器 用于过滤物理网络适配器的数据 xff0c 因此也被称为网络过滤驱动器 net filt
  • 设置电脑网络唤醒-华硕主板+向日葵

    我一直用向日葵的开机棒唤醒电脑 xff0c 后来重装系统 xff0c 就开机棒失效了 由于是重装系统 xff0c 所以BIOS的设置没问题的 xff0c 就怀疑是新系统需要设置 xff0c 找了好久找到这个教程 xff0c 记录一下 参考这
  • 各种排序的运行时间对比

    冒泡排序 cpp view plain copy time 34 220s include lt cstring gt include lt iostream gt include lt fstream gt include lt algo
  • Cordova概述

    Cordova Apache Cordova is an open source mobile development framework It allows you to use standard web technologies HTM
  • Ubuntu18.04 项目配置

    有问题多重启就好啦 1 换源2 配置输入法3 安装Nvidia驱动4 安装Cuda5 下载谷歌浏览器并安装6 安装Anaconda37 pip换源8 Ubuntu18 04 无法通过蓝牙链接 Airpods9 安装PyCharm10 安装P
  • 基于numpy的CNN实现,进行MNIST手写数字识别

    主要框架来自于这篇文章 xff1a https blog csdn net qq 36393962 article details 99354969 xff0c 下面会以原文来代称这篇文章 本文在原文的基础上增加了交叉熵以及mnist数据集
  • libevent 的http模块实现http服务器

    首先声明 xff0c libevent的http模块是为单线程设计的 xff0c 如果业务逻辑中有耗时操作 xff0c 则需要自行设计线程池以便提高吞吐量 xff0c 每个工作线程中都要运行一个event base loop和一个evhtt
  • swig 使用案例

    包含数组 结构体嵌套 xff0c 函数指针传递等基本操作 swig默认不支持数组元素的写入 xff0c 如果想操作数组元素 xff0c 可以附加一些接口函数实现 比如下面在处理结构体的数组成员时 xff0c 使用 extend命令扩展了对应
  • 攻击防御实例——SQL注入

    攻击防御实例 SQL注入 1 i 表示匹配的时候不区分大小写 2 s 匹配任何不可见字符 xff0c 包括空格 制表符 换页符等等 等价于 f n r t v 3 information schema xff1a 是一个数据库 xff0c
  • 264 nal type

    NUAL HEAD 43 43 0 1 2 3 4 5 6 7 43 43 43 43 43 43 43 43 43 F NRI Type 43 43 F xff1d Forbidden zero bit 61 0 NRI 61 Nal r
  • SubClassWindow详解

    许多Windows程序员都是跳过SDK直接进行RAD开发工具 或VC xff0c 我想VC应不属于RAD 的学习 xff0c 有些人可能对子类化机制比较陌生 我们先看看什么是Windows的子类化 Windows给我们或是说给它自己定义了许
  • stl upper_bound函数实现

    写了一个upper bound的实现 其中递归使用二分法求解最上界 xff0c 虽然写的完全不像STL的风格 xff0c 但是练手还是可以的 view plaincopy to clipboardprint 01 include lt io
  • 关于TrackMouseEvent用法总结

    对于这个函数我也是最近想研究控件自绘才知道它真正怎么用 以前只是见到过 嗯 废话不多说 我先说下我的问题 如何响应鼠标离开某个窗体 控件 事件 先大概讲下步骤 然后再集中对 TrackMouseEvent 进行详解 为按钮添加以下几个函数
  • 关于CComboBox的自绘

    我想 如果大家学过一些控件的自绘的话 CComboBox算是很难的一种了 首先是它本身的复杂度 它由三个控件组成 CEdit CListBox CButton 我想但就CEdit来讲 就够你受得了 还要想想他们之间的消息传递 不禁让人无从下
  • 内部链接与外部链接

    在说内部连接与外部连接前 xff0c 先说明一些概念 1 声明 一个声明将一个名称引入一个作用域 在c 43 43 中 xff0c 在一个作用域中重复一个声明是合法的 以下都是声明 xff1a int foo int int 函数前置声明
  • partition/stable_partition详解

    Partition 将满足条件的元素向前移动 TEMPLATE FUNCTION partition template lt class BidIt class Pr gt inline BidIt Partition BidIt Firs