对某个区间操作(sort,stable_sort,parital_sort,parital_sort_copy,nth_element,is_sorted)

sort

//版本一 
template <class RandomAccessIterator>
void sort(RandomAccessIterator first,RandomAccessIterator last);
//版本二 
template <class RandomAccessIterator,class StrictWeakOrdering)
void sort(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);

stable_sort

//版本一 
template <class RandomAccessIterator>
void stable_sort(RandomAccessIterator first,RandomAccessIterator last);
//版本二 
template <class RandomAccessIterator,class StrictWeakOrdering)
void stable_sort(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);
  1. stable_sort会保证排序后元素的相对位置不变(把某序列按姓排序,如果姓相同而名不同,则视为等价,此时相对位置不改变,用stable_sort函数),使用merge sort算法
  2. sort不会保证排序后的相对位置相同,因此sort比stable_sort快,使用intersort算法
  3. 每个函数都有两个版本,第一个版本重载operator < ,第二个版本调用自己定义的function object
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class F
{
    public:
        bool operator()(int i,int j)
        {
            return (i%10)>=(j%10);    
        }    
};
int main()
{
    vector<int> v{2,1,-1,5,6,3};
    sort(v.begin(),v.end(),F());
    for_each(v.begin(),v.end(),[](int i)
    {
        cout<<i<<" ";
    });
    cout<<endl;
    return 0;    
} 

 parital_sort

//版本一,使用operator <来比较,都是先取元素后排序
template <class RandomAccessIterator>
void partial_sort(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last); 

//版本二 ,用自定义的function object来比较
template <class RandomAccessIterator,class StrictWeakOdering>
void partial_sort(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last,StrictWeakOdering cmp);
  1. 使[first,middle)中个最小元素以递增方式排序,[middle,last)中无序,但[middle,last)中的每个元素都大于[first,middle)中的元素
  2. 用partial_sort而不用sort的理由是partial_sort挑选出来n个元素来排序比对整个区间来排序要快
  3. middle==first,无意义,先将0个元素放入[first,first)中,然后将剩余元素也即是所有元素放入[first,last)中,唯一保证是[first,last)中的元素以未知顺序排序过
  4. middle==last,是对整个区间排序

partial_copy_sort

//版本一
template <class RandomAccessIterator>
void partial_sort_copy(RandomAccessIterator first,RandomAccessIterator last,RandomAccessIterator result_first,RandomAccessIterator result_last); 

//版本二 
template <class RandomAccessIterator,class StrictWeakOdering>
void partial_sort_copy(RandomAccessIterator first,RandomAccessIterator last,RandomAccessIterator result_first,RandomAccessIterator result_last,StrictWeakOdering cmp);

  与partial_sort基本类似,复制[firstlast)中n个最小的元素到[result_first,result_first+n)中,n为[first,last)和[result_first,result_last)中的最小值,然后在进行排序。

  不能copy到标准输出设备,result为RandomAccessIterator

nth_element

template <class RandomAccessIterator>
void nth_element(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last);

template <class RandomAccessIterator,class StrickWeakOrdering>
void nth_element(RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last,StrickWeakOrdering cmp);

  这里唯一的保证是数组被分为两段,第一段内的任何元素都不大于第二段,而每段中的内部排序并非重点

is_sorted

//版本一:调用operator < 
template <class ForwardIterator>
bool is_sorted(ForwardIterator first,ForwardIterator last);

//版本二:调用自己定义的function object
template <class ForwardIterator,class StrictWeakOrdering>
bool is_sorted(ForwardIterator first,ForwardIterator last,StrictWeakOrdering cmp);

  两个版本都不操作range,只是测试range是否已经排过序,若first==last,两个版本都返回true

#include <iostream>
#include <vector>
#include <algorithm>
#include <typeinfo> 
#include <list>
using namespace std;

int main()
{
    vector<int> v{1,2,3,4,6,5};
    cout<<is_sorted(v.begin(),v.end())<<endl;
    /*typedef typename iterator_traits<list<int>::iterator>::iterator_category ic;
    cout<<typeid(ic).name()<<endl;*/
    cout<<is_sorted(v.begin(),v.begin())<<endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/tianzeng/p/10390562.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值