美文网首页
STL算法(排序)

STL算法(排序)

作者: 第八区 | 来源:发表于2017-09-04 15:35 被阅读20次

    简介

    merge
    sort
    random_shuffle
    reverse

    merge

    合并两个有序序列,存放到另一个序列。函数定义:

     #if _ITERATOR_DEBUG_ARRAY_OVERLOADS
    template<class _InIt1,
        class _InIt2,
        class _OutTy,
        size_t _OutSize,
        class _Pr> inline
        _OutTy *merge(_InIt1 _First1, _InIt1 _Last1,
            _InIt2 _First2, _InIt2 _Last2,
            _OutTy (&_Dest)[_OutSize], _Pr _Pred)
        {   // copy merging ranges, both using _Pred, array dest
        return (_Unchecked(
            _Merge_no_deprecate(_First1, _Last1,
                _First2, _Last2,
                _Array_iterator<_OutTy, _OutSize>(_Dest), _Pred)));
        }
     #endif /* _ITERATOR_DEBUG_ARRAY_OVERLOADS */
    
            // TEMPLATE FUNCTION merge
    template<class _InIt1,
        class _InIt2,
        class _OutIt> inline
        _OutIt merge(_InIt1 _First1, _InIt1 _Last1,
            _InIt2 _First2, _InIt2 _Last2,
            _OutIt _Dest)
        {   // copy merging ranges, both using operator<
        return (_STD merge(_First1, _Last1, _First2, _Last2, _Dest,
            less<>()));
        }
    

    sort

    以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入比较函数。

    template<class _RanIt,
        class _Pr> inline
        void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)
        {   // order [_First, _Last), using _Pred
        _DEBUG_RANGE(_First, _Last);
        _Sort_unchecked(_Unchecked(_First), _Unchecked(_Last), _Pred);
        }
    
            // TEMPLATE FUNCTION sort
    template<class _RanIt> inline
        void sort(_RanIt _First, _RanIt _Last)
        {   // order [_First, _Last), using operator<
        _STD sort(_First, _Last, less<>());
        }
    

    random_shuffle

    对指定范围内的元素随机调整次序
    srand(time(0)); //设置随机种子

    template<class _RanIt> inline
        void random_shuffle(_RanIt _First, _RanIt _Last)
        {   // shuffle [_First, _Last) using rand()
        _Rand_urng_from_func _Func;
        _STD shuffle(_First, _Last, _Func);
        }
    

    reverse

    对指定范围内的元素逆序

    template<class _BidIt> inline
        void reverse(_BidIt _First, _BidIt _Last)
        {   // reverse elements in [_First, _Last)
        _DEBUG_RANGE(_First, _Last);
        _Reverse_unchecked(_Unchecked(_First), _Unchecked(_Last));
        }
    

    示例代码

    #include "stdafx.h"
    #include "stdafx.h"
    #include "iostream"
    #include "string"
    #include "algorithm"
    #include "vector"
    #include "list"
    #include <functional>
    using namespace std;
    class Student {
    private:
        int number;
        string name;
    public:
        //Student() {
        //  this->number = -1;
        //  this->name = "";
        //}
        Student(int number, string name) {
            cout << "构造 " << number << " " << name.c_str() << endl;
            this->number = number;
            this->name = name;
        }
        Student(const Student & stu) {
            //cout << "copy构造" <<stu.getNumber()<<" "<<stu.getName().c_str()<< endl;
            this->number = stu.getNumber();
            this->name = stu.getName();
        }
        ~Student() {
            //cout<<"析构 " << this->number << " " << this->name.c_str() << endl;
        }
    
        Student& operator=(const Student& stu) {
            this->number = stu.getNumber();
            this->name = stu.getName();
            return *this;
        }
    
        void print()const {
            cout << "print 》》 " << this->number << " " << this->name.c_str() << endl;
        }
    
        int getNumber() const {
            return this->number;
        }
        string getName()const {
            return this->name;
        }
    };
    
    struct StuFunc
    {
        bool operator()(const Student & stu1, const Student & stu2) const {
            cout << "StuFunc》》" << endl;
            stu1.print();
            stu2.print();
            return stu1.getNumber() <stu2.getNumber();
        }
    };
    
    void printStuV(vector<Student> v) {
        cout << "开始遍历vector<Student>============" << endl;
        for (vector<Student>::iterator it = v.begin(); it != v.end(); it++) {
            it->print();
        }
        cout << "结束遍历vector<Student>============" << endl;
    }
    void printNum(vector<int>v) {
        cout << "开始遍历vector<int>============" << endl;
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
        cout << "结束遍历vector<int>============" << endl;
    }
    
    int main()
    {
        //merge示例
        vector<int> vNum;
        vNum.push_back(1);
        vNum.push_back(3);
        vNum.push_back(5);
        vector<int> vNum2;
        vNum2.push_back(2);
        vNum2.push_back(4);
        vector<int> vNum3;
        vNum3.resize(vNum.size() + vNum2.size());
        merge(vNum.begin(), vNum.end(), vNum2.begin(), vNum2.end(), vNum3.begin());
        printNum(vNum3);
    
        vector<Student> v;
        v.push_back(Student(1, "one"));
        Student stu2(2, "two");
        v.push_back(stu2);
        v.push_back(Student(4, "four"));
        v.push_back(Student(3, "three"));
        v.push_back(Student(5, "five"));
        cout << "sort 随机排序" << endl;
        sort(v.begin(), v.end(), StuFunc());
        printStuV(v);
        cout << "random_shuffle 随机排序" << endl;
        random_shuffle(v.begin(), v.end());
        printStuV(v);
        cout << "reverse 逆序" << endl;
        reverse(v.begin(), v.end());
        printStuV(v);
        return 0;
    }
    

    结果:

    sort

    相关文章

      网友评论

          本文标题:STL算法(排序)

          本文链接:https://www.haomeiwen.com/subject/fwsejxtx.html