c++11:std::partition分割,std::is_partitioned判断

序列

  vec.clear();
    for(int i =0;i<10;i++){
        vec.push_back(i);
    }

重新分割。大于1的排在后,返回第一个

std::vector<int>::iterator it = std::partition(vec.begin(),vec.end(),[](int value){return value>1;});
std::cout<<"partition:"<<*it<<std::endl;

输出

partition:1

排序后结果

 for(size_t i = 0;i<vec.size();i++){
        std::cout<<vec.at(i)<<" ";
    }

输出

9 8 2 3 4 5 6 7 1 0

除了小于1往后移动,其他原位置也已经和原来不一致

稳定排序

std::stable_partition

修改原序列,但是保持原排序

std::stable_partition(vec.begin(),vec.end(),[](int value){return value>1;});

输出

2 3 4 5 6 7 8 9 0 1

std::partition_copy

保持原序列,保持原排序,重新拷贝到两个新序列

{
        std::vector<int> vec{1,2,3,6,5,4,7,8,9,10};
        std::vector<int> vec1(10,1);
        std::vector<int> vec2(10,2);
        //返回 pair<_OIter1, _OIter2> 类型值
        auto result = std::partition_copy(vec.begin(),vec.end(),vec1.begin(),vec2.begin(),[](int n){return (0 == n%2);});
        //执向vec1的最后一个元素之后的值
        std::cout<< "vec1 first:"<<*result.first<<" size:"<<result.first-vec1.begin()<<std::endl;
        //执向vec2的最后一个元素之后的值
        std::cout<< "vec2 second:"<<*result.second<<" size:"<<result.second-vec2.begin()<<std::endl;
        for(auto it=vec1.begin();it!=result.first;it++){
             std::cout<<*it<<" ";
        }
        std::cout<<" "<<std::endl;
        for(auto it=vec2.begin();it!=result.second;it++){
             std::cout<<*it<<" ";
        }
        std::cout<<" "<<std::endl;
    }

结果

vec1 first:1 size:5
vec2 second:2 size:5
2 6 4 8 10
1 3 5 7 9

判断是否被分割排序过

  std::cout<<"is_partitioned:"<<std::is_partitioned(vec.begin(),vec.end(),[](int value){return value>1;});

输出

is_partitioned:1

注意std::is_partitioned用来判断整个序列是否被划分为两个部分,而不是只判断前一部分或后一部分是否满足条件。即用你给的第三个函数来判断

如果是分割过。可以直接找分割点

{
        std::vector<int> vec{2,4,6,8,1,3,5,7,9};
        std::vector<int>::iterator find = std::partition_point(vec.begin(),vec.end(),[](int n){return (0 == n%2);});
        for(auto it = vec.begin();it!=find;it++){
            std::cout<<*it<<" ";
        }

        std::cout<<" "<<std::endl;
        for(auto it = find;it!=vec.end();it++){
            std::cout<<*it<<" ";
        }
        std::cout<<" "<<std::endl;
    }

输出

2 4 6 8
1 3 5 7 9

扩展

std::partial_sort

std::partial_sort部分排序,即序列只对部分,比如1000万个数据排序出前面10个
例子
1.获取前4

 std::partial_sort(std::begin(vec),std::begin(vec)+4,std::end(vec));
    for(size_t i = 0;i<vec.size();i++){
        std::cout<<vec.at(i)<<" ";
    }
    std::cout<<" "<<std::endl;

自定义比较

std::partial_sort(std::begin(vec),std::begin(vec)+4,std::end(vec),[](int n1,int n2){return n1>n2;});
    for(size_t i = 0;i<vec.size();i++){
        std::cout<<vec.at(i)<<" ";
    }

结果

0 1 2 3 6 7 8 9 5 4
9 8 7 6 0 1 2 3 5 4

std::partial_sort_copy

排序到另一个容器中

    std::vector<int> vec1(5);
    std::partial_sort_copy(std::begin(vec),std::end(vec),std::begin(vec1),std::end(vec1));
    for(auto& it:vec1){
        std::cout<<it<<" ";
    }
    std::cout<<" "<<std::endl;

即vec按大小排序5个到新容器vec1中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值