0

0

C++中的std::partition是什么?(如何根据条件对容器分组)

冰火之心

冰火之心

发布时间:2026-02-21 12:59:38

|

925人浏览过

|

来源于php中文网

原创

std::partition 是原地二元划分算法,将满足谓词的元素全移至前段、不满足的移至后段,不保序,返回分界迭代器;时间复杂度 o(n),空间复杂度 o(1)。

c++中的std::partition是什么?(如何根据条件对容器分组)

std::partition 是什么,它到底改了什么

它把容器里满足条件的元素“全挪到前面”,不满足的“全挪到后面”,但不保证各自内部顺序。不是排序,也不是复制新容器,是原地重排——std::partition 直接修改你传进去的迭代器范围。

常见错误现象:std::partition 返回一个迭代器,指向第一个“不满足条件”的元素位置,很多人忽略这个返回值,结果后续逻辑用错分界点。

  • 使用场景:快速划分“有效/无效”、“就绪/未就绪”、“正数/非正数”这类二元状态,比如预处理数据、实现 quickselect 的分区步骤
  • 参数差异:它只接受一个一元谓词(UnaryPredicate),比如 [](int x) { return x > 0; },不能像 std::stable_partition 那样保序,也不能像 std::partition_copy 那样不改动原容器
  • 性能影响:平均 O(n),单次遍历,空间复杂度 O(1),比先拷贝再筛选快,但会破坏原有顺序

怎么安全拿到前后两段的迭代器边界

别靠猜,std::partition 的返回值就是关键分界点。用它来切分,否则容易越界或漏判。

示例:

AMiner
AMiner

AMiner——新一代智能型科技情报挖掘与服务系统,能够为你提供查找论文、理解论文、分析论文、写作论文四位一体一站式服务。

下载

立即学习C++免费学习笔记(深入)”;

std::vector<int> v = {−3, 1, −5, 2, 0, 4};
auto pivot = std::partition(v.begin(), v.end(), [](int x) { return x > 0; });
// pivot 指向第一个 ≤0 的元素,比如可能指向 v[2](值为−5)
// [v.begin(), pivot) 是所有 >0 的数
// [pivot, v.end()) 是剩下的
  • 常见错误:直接用 v.size() / 2 或固定下标当分界,实际分区后长度完全取决于谓词结果分布
  • 如果需要稳定顺序(比如保持正数之间的原始先后),得换用 std::stable_partition,但代价是 O(n) 空间
  • 注意:谓词不能修改元素本身,否则行为未定义;也不要抛异常,标准要求谓词必须是无异常的

和 std::stable_partition、std::partition_copy 有什么实质区别

三者目标相似,但约束和开销不同,选错会影响正确性或性能。

  • std::partition:最快,O(1) 额外空间,但顺序全乱 —— 适合中间计算、不在乎顺序的场景
  • std::stable_partition:保持各自段内原顺序,但需 O(n) 额外内存(或 O(log n) 如果分配失败回退)—— 适合输出要可读、可调试的场合
  • std::partition_copy:不碰原容器,把两组分别拷进两个目标范围 —— 适合只读输入或需要保留原始数据时
  • 兼容性:三者都要求前向迭代器,std::partition 在 C++98 就有,后两者是 C++11 加入

谓词写错会导致什么,怎么验证是否真分对了

谓词逻辑反了、捕获变量失效、或者用了有副作用的操作,std::partition 仍会“成功”执行,但结果完全不对——而且编译器几乎不报错。

  • 常见错误现象:分区后发现“满足条件”的段里混着 0 或负数,大概率是谓词用了 x >= 0 却误以为是“正数”,或忘了 0 的归属
  • 调试建议:分区后手动检查分界点两侧各一两个元素,比如打印 *pivot*(pivot−1)(确保 pivot 不等于 begin)
  • 避免副作用:谓词里不要调 std::cout、不要改外部变量、不要调用可能抛异常的函数
  • 注意 const 正确性:如果容器元素是 const 或来自 const 容器,谓词参数类型得匹配,比如用 const int& 而不是 int&

最易被忽略的是:分区操作本身不验证谓词是否自洽——比如谓词对同一元素多次调用返回不同结果(比如依赖全局计数器),行为就未定义。写谓词时得把它当成纯函数对待。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

549

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

810

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

578

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

274

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

459

2023.08.14

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

868

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

276

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

178

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.8万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 18.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号