vec.clear();
for(int i =0;i<10;i++){
vec.push_back(i);
}
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(vec.begin(),vec.end(),[](int value){return value>1;});
输出
2 3 4 5 6 7 8 9 0 1
保持原序列,保持原排序,重新拷贝到两个新序列
{
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部分排序,即序列只对部分,比如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::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中