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