0

0

c++中如何使用std::partition划分容器_c++快速划分算法用法

冰火之心

冰火之心

发布时间:2026-01-06 17:51:08

|

620人浏览过

|

来源于php中文网

原创

std::partition 原地二分划分,满足谓词的元素移至前段、不满足的移至后段,不保证组内顺序;返回分界迭代器,要求双向迭代器、无异常谓词且不可修改容器。

c++中如何使用std::partition划分容器_c++快速划分算法用法

std::partition 会原地重排容器,不保证相对顺序

它把满足谓词的元素移到前面,不满足的移到后面,但同一组内的原始顺序不保留。这和 std::stable_partition 有本质区别——后者保序,但性能略差。

常见误用是以为它像 std::sort 那样“整理”数据,其实它只做二分划分,不排序也不稳定。

  • 必须传入双向迭代器(std::vectorstd::list 可用;std::forward_list 不行)
  • 谓词应为一元函数对象,返回 bool,不能修改元素本身
  • 返回值是分界点迭代器,指向第一个“不满足条件”的元素

正确调用 std::partition 的三要素

std::vector 划分正负数为例:

std::vector v = {-2, 3, -1, 4, 0, -5};
auto pivot = std::partition(v.begin(), v.end(), [](int x) { return x > 0; });

执行后 v 可能变为 {3, 4, -2, -1, 0, -5}(正数在前,但 3 和 4 的相对位置可能交换),pivot 指向 -2

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

Lovart
Lovart

全球首个AI设计智能体

下载
  • 迭代器范围必须合法(不可用 end() 作起始,也不可越界)
  • 谓词不能抛异常(否则行为未定义)
  • 若容器为空,std::partition 直接返回 begin(),不报错

和 std::partition_copy 的关键区别

std::partition_copy 不修改原容器,而是把满足/不满足的元素分别拷贝到两个目标区间。适合“只读划分 + 分别处理”场景。

例如需要同时统计奇偶数量又保留原数组:

std::vector src = {1, 2, 3, 4, 5};
std::vector odds, evens;
std::partition_copy(src.begin(), src.end(),
                    std::back_inserter(odds), std::back_inserter(evens),
                    [](int x) { return x % 2 != 0; });
  • std::partition:就地、快(O(n) 时间,O(1) 额外空间)、不保序
  • std::partition_copy:非破坏性、需双倍空间、同样不保序,但避免副作用
  • 没有 “partial partition” 或 “nth partition” 这类标准变体,别被名字误导

容易踩的坑:谓词捕获与迭代器失效

若谓词里捕获了容器引用并试图修改它,会导致未定义行为。例如:

std::vector data = {1,2,3};
std::partition(data.begin(), data.end(), [&data](int x) {
    data.push_back(x * 2); // ❌ 危险!可能使迭代器失效
    return x > 1;
});
  • 谓词只能读取,不能触发重分配、插入、删除等操作
  • std::vector 使用时,确保容量足够,避免内部 realloc 导致迭代器全废
  • 多线程下,不能在谓词中访问共享状态而无同步——这不是线程安全操作

实际项目中,最常被忽略的是:划分后没用返回的 pivot 迭代器去切分逻辑,而是重新遍历或硬编码索引,白白浪费了算法提供的分界信息。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

381

2023.09.04

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

381

2023.09.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

476

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

141

2025.12.24

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

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

394

2023.08.14

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

c++ Libcurl用法详解
c++ Libcurl用法详解

本专题整合了c++ Libcurl用法详解,阅读专题下面的文章了解更多详细内容。

0

2026.01.07

c++ Libcurl用法大全
c++ Libcurl用法大全

本专题整合了c++ Libcurl用法详解,阅读专题下面的文章了解更多详细内容。

0

2026.01.07

C++ vector用法汇总
C++ vector用法汇总

本专题整合了C++中vector的用法大全,阅读专题下面的文章了解更多详细内容。

2

2026.01.07

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Rust 教程
Rust 教程

共28课时 | 4.2万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

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

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