讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋静同学_2876

秋静同学_2876

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

|

945人浏览过

|

来源于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 的返回值就是关键分界点。用它来切分,否则容易越界或漏判。

示例:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“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工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

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

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

2098

2023.09.20

string转int
string转int

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

5939

2023.08.02

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

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

2925

2024.08.29

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

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

3708

2025.08.29

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

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

2605

2025.08.29

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

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

5496

2023.08.14

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

20

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

0

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn