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详解 的相关文章

  • ubuntu 16.04 谷歌浏览器google-chrome-stable : Depends: libu2f-udev but it is not installable

    sudo apt get install google chrome stable Reading package lists Done Building dependency tree Reading state information
  • CPU硬解Stable-Diffusion

    很多小伙伴说 哎呀 我没有显卡 哎呀 我显存是AMD的 哎呀 我没有足够的显存 那这一期 将带来CPU和内存运算SD 其实很简单 我们只需要将 COMMANDLINE ARGS 环境变量设置为 skip torch cuda test 然后
  • 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
  • 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 卡通图像生成
  • 【leetcode】561. 数组拆分 I(array-partition-i)(贪心)[简单]

    链接 https leetcode cn com problems array partition i 耗时 解题 xff1a 5 min 题解 xff1a 24 min 题意 给定长度为 2n 的整数数组 nums xff0c 你的任务是
  • 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
  • 要点初见:Stable Diffusion NovelAI模型优质文字Tag汇总与实践【魔咒汇总】

    目前贴吧 B站上有大量Stable Diffusion的模型资源 TAG TAG生成器分享 xff0c 其中居然有不少试图靠信息差把这些开源资源卖钱的 加上目前网上相关的TAG整理贴极少 xff0c 不少TAG也是以图片的形式存在 xff0
  • 如何将一组数字分成两组,使得它们的和之差最小

    如何编写 Java 程序将一组数字分为两组 以使它们各自的数字之和的差异最小 例如 我有一个包含整数的数组 5 4 8 2 我可以将它分成两个数组 8 2 和 5 4 假设给定的一组数字 可以有一个唯一的解决方案 如上面的例子 如何编写Ja
  • C随机主元快速排序(改进配分函数)

    我是一名计算机科学专业的学生 刚刚开始 我正在努力从伪代码编写快速排序的随机枢轴版本 我已经编写并测试了它 但一切都很完美 分区部分看起来有点太复杂了 感觉漏掉了什么或者想太多了 我不明白这是否可以 或者我是否犯了一些可以避免的错误 长话短
  • Cassandra 存储桶拆分以调整分区大小

    我对 Cassandra 很陌生 我刚刚通过 Datastax 课程学习了它 但我在此处或互联网上没有找到足够的有关存储桶的信息 并且在我的应用程序中我需要使用存储桶来拆分数据 我有一些工具可以进行很多测量 并且每天拆分测量 时间戳作为分区
  • 从另一个表创建临时表,包括配置单元中的分区列

    我正在使用另一个表创建临时表AS我将另一个表的分区列包含在临时表中 然后出现以下错误 下面是表创建语句 其中col4是表的分区列xyz 在运行创建语句时 我收到以下错误 当我删除col4从创建语句来看它运行良好 Error 编译语句时出错
  • 在hive中向外部表添加分区需要花费大量时间

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

    我是 hadoop 和 hive 的新手 我会知道 hive中索引和分区有什么区别 什么时候使用索引 什么时候分区 谢谢你 索引是新的并且正在不断发展 正在添加功能 但目前索引仅限于单个表 并且不能与外部表一起使用 创建索引会创建一个单独的
  • 在分区内的多个列上进行 Spark 聚合,无需进行洗牌

    我正在尝试在多个列上聚合数据框 我知道聚合所需的所有内容都在分区内 也就是说 不需要洗牌 因为聚合的所有数据都是分区本地的 采取example http dmtolpeko com 2015 02 12 multi column key a
  • 在 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
  • 当 Spark 主内存无法容纳文件时,Spark 如何读取大文件(PB)

    在这些情况下大文件会发生什么 1 Spark从NameNode获取数据的位置 Spark 是否会同时停止 因为根据 NameNode 的信息 数据大小太长 2 Spark按照datanode块大小对数据进行分区 但所有数据不能存储到主内存中
  • SQL 错误:ORA-14006:无效的分区名称

    我正在尝试使用以下 SQL 语句对 Oracle 12C R1 中的现有表进行分区 ALTER TABLE TABLE NAME MODIFY PARTITION BY RANGE DATE COLUMN NAME INTERVAL NUM

随机推荐

  • STM32F103ZET6和STM32F103C8T6芯片的区别

    是这样的 xff0c 一个具体的STM32F103系列芯片的内存有多大 xff0c 你看一下芯片上的型号就行了 STM32F103XY 注意 xff0c XY是个代号 xff0c X是表示封装有多少个引脚 xff0c 比如 xff0c 如果
  • Keil(MDK-ARM)使用教程——在线调试

    Keil xff08 MDK ARM xff09 使用教程 xff08 三 xff09 在线调试 由于我是直接使用 xff08 打开现有的软件工程 xff09 xff0c 如果跟着需要下载上面演示参考的软件工程 才行 工程默认是使用硬件在线
  • ch340是什么芯片

    CH340 是一个USB 总线的转接芯片 xff0c 实现USB 转串口 USB 转IrDA 红外或者USB 转打印口 在串口方式下 xff0c CH340 提供常用的MODEM联络信号 xff0c 用于为计算机扩展异步串口 xff0c 或
  • Ubuntu16的详细安装教程

    有一点很重要要说一下 xff0c 每个人学习Linux的动机都不一样 xff0c 而这个动机会决定你对Linux的态度 xff0c 如果你仅仅是想尝鲜 xff0c 装个笔什么的 xff0c 不当作自己的职业方向去学习Linux的 劝这类人还
  • 是否能在keil中混合编译c和c++程序

    keil中支持混合编译C和C 43 43 程序 xff0c 因为其本质最终都是编译成汇编 xff0c 所以是可以同时操作的 在混合编译时 xff0c 需要注意以下几点 xff1a 1 C文件扩展名必须为 C xff0c C 43 43 文件
  • ds18b20工作原理和测温原理介绍

    DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器 与传统的热敏电阻相比 xff0c 他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9 xff5e 12位的数字值读数方式 可以分别在9
  • 如何将.hex文件转化为.c文件

    说明楼主太初级 xff0c 迷恋于C 1 C与HEX并不是一一映射的 xff0c 有可能N个人写的C xff0c 会出同一个HEX xff0c 你希望回成哪个人写的呢 xff1f 或许你可能说 xff1a 任意一个孝可以 xff0c 只要能
  • 嵌入式linux 和 用stm32进行的嵌入式开发 这两者之间有什么关联性吗?

    作者 xff1a 知乎用户 链接 xff1a https www zhihu com question 53880054 answer 164501004 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非
  • #if 0 ... #endif的真实用途

    在过去都没有去理会 if 的作用 xff0c 今天突发奇想 xff0c 开启编译器试一试 很多人都知道 if 0 endfif的作用跟 的作用是一样的 xff0c 就是注释 xff0c 可是注释为什么不用注释符号 就行了么 xff1f go
  • .hex文件和.bin文件区别

    HEX文件和BIN文件是我们经常碰到的2种文件格式 因为自己也是新手 xff0c 所以一直对这两个文件懵懵懂懂 xff0c 不甚了解 xff0c 最近在做STM32单片机的IAP更新 xff0c 其中要考虑HEX文件和BIN文件 xff0c
  • EEPROM和flash的区别

    From https blog csdn net yuanlulu article details 6163106 EEPROM的全称是 电可擦除可编程只读存储器 xff0c 即Electrically Erasable Programma
  • 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
  • 云原生 - 2、Openstack架构

    云原生 2 Openstack架构 1 什么是Openstack2 Release3 核心架构4 官方入口5 核心组件6 相关文章导读 1 什么是Openstack OpenStack是一个开源的云计算管理平台项目 xff0c 由NASA
  • 关于TrackMouseEvent用法总结

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

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

    又是一年年终时 亦是一年总结时 想想自己从去年写年终总结到现在 已经很久没有写过字了 时间过得真快 又是一年过去了 这一年也是我出来工作的第二年 这一年总体来说自己无论在技术还是心态方面有了很大的进步 记得刚出学校那会 啥都不知道 对于工作
  • 内部链接与外部链接

    在说内部连接与外部连接前 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