首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::stable_partition()和std::partition()有什么区别?

std::stable_partition()和std::partition()有什么区别?
EN

Stack Overflow用户
提问于 2020-01-08 15:51:33
回答 3查看 1.2K关注 0票数 3
代码语言:javascript
复制
stable_partition(vect.begin(), vect.end(), [](int x) { return x % 2 == 0; });

partition(vect.begin(), vect.end(), [](int x) {
  return x % 2 == 0;
});

上面的代码是为了解释两者之间的区别。

EN

回答 3

Stack Overflow用户

发布于 2020-01-08 15:54:32

“稳定”表示等价元素的顺序不会改变:

来自cppreference.comstd::stable_partition

对范围[first,last]中的元素进行重新排序,使谓词p返回true的所有元素都在谓词p返回false的元素之前。保留元素的相对顺序。

票数 7
EN

Stack Overflow用户

发布于 2020-01-08 16:09:12

解决这个问题的最好方法可能是举个例子。让我在这里抄袭一下cppreference的例子:

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v{0, 0, 3, 0, 2, 4, 5, 0, 7};
    std::stable_partition(v.begin(), v.end(), [](int n){return n>0;});
    for (int n : v) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

运行这个命令会得到:3 2 4 5 7 0 0 0 0。3、2、4、5、7对于由> 0谓词定义的关系是等价的,并且正如预期的那样,它们不会被重新排序。

但是,如果将相同示例的stable_partition替换为partition,则会得到:7 5 3 4 2 0 0 0 0。这一次,没有保证保持等价元素的顺序,显然也没有保证。

票数 6
EN

Stack Overflow用户

发布于 2020-01-08 16:19:30

正如在其他答案中所解释的那样,std::stable_partition保留了谓词返回truefalse的组中元素的相对顺序。

但这是有代价的:std::stable_partition具有更高的时间/空间复杂度。如果您可以分配额外的存储空间,则可以在O(n)时间内实现std::stable_partition。但是,不能在O(n)时间内实现就地稳定分区。它可以在O(n log n)时间内完成。一个简单的分而治之算法的例子可以在here中找到。

适用于std::stable_partition reads的C++参考

Complexity (**std::stable_partition**)

给定N = last - first

如果有足够的额外内存,谓词和O(N)N应用程序完全可以互换。如果内存不足,最多只能交换N log N

另请注意,std::stable_partition requires bidirectional iterators,而std::partition可以在前向操作。然而,在双向迭代器上,它是more efficient

Complexity (**std::partition**)

给定N = std::distance(first,last)

谓词的N应用程序。如果ForwardIt满足LegacyBidirectionalIterator的要求,则最多交换N/2,否则最多交换N

如果分区后元素的相对顺序并不重要,请使用std::partition

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59641533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档