序列
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中