• vector系列--使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())


    写了挺多关于vector的操作了,正好工作中遇到对vector进行排序的问题,这里就讨论一下。

    直接使用sort算法,那就先了解一下:

    template <class RandomAccessIterator>
      void sort (RandomAccessIterator first, RandomAccessIterator last);
    template <class RandomAccessIterator, class Compare>
      void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
    

      Sorts the elements in the range [first,last) into ascending order.

    The elements are compared using operator< for the first version, and comp for the second.
    Equivalent elements are not guaranteed to keep their original relative order (see stable_sort).
    也就是所说的不稳定排序。

    #include <iostream>     // std::cout
    #include <algorithm>    // std::sort
    #include <vector>       // std::vector
    #include <string>
    
    bool myfunction(int i, int j) { return (i<j); }
    
    struct myclass {
        bool operator() (int i, int j) { return (i<j); }
    } myobject;
    
    int main() {
        int myints[] = { 32,71,12,45,26,80,53,33 };
        std::vector<int> myvector(myints, myints + 8);// 32 71 12 45 26 80 53 33
    
        // using default comparison (operator <)
        std::sort(myvector.begin(), myvector.begin() + 4);  //(12 32 45 71)26 80 53 33
    
        // using function as comp
        std::sort(myvector.begin() + 4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
    
        // using object as comp
        std::sort(myvector.begin(), myvector.end(), myobject);  //(12 26 32 33 45 53 71 80)
    
        // print out content:
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
            std::cout << ' ' << *it;
        std::cout << '
    ';
        // Sorting the string vector
        std::vector<std::string> stringVec = { "John", "Bob", "Joe", "Zack", "Randy" };
        sort(stringVec.begin(), stringVec.end());
    
        for (std::string &s : stringVec)
            std::cout << s << " ";
    
    
        return 0;
    }
    
    //输出:
    myvector contains: 12 26 32 33 45 53 71 80
    Bob Joe John Randy Zack
    

      这个时候可以使用std::stable_sort()来实现稳定的排序了:

    Sorts the elements in the range [first,last) into ascending order, like sort, but stable_sort preserves the relative order of the elements with equivalent values.

    #include <iostream>     // std::cout
    #include <algorithm>    // std::stable_sort
    #include <vector>       // std::vector
    
    bool compare_as_ints(double i, double j)
    {
        return (int(i)<int(j));
    }
    
    int main() {
        double mydoubles[] = { 3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58 };
    
        std::vector<double> myvector;
    
        myvector.assign(mydoubles, mydoubles + 8);
    
        std::cout << "using default comparison:";
        std::stable_sort(myvector.begin(), myvector.end());
        for (std::vector<double>::iterator it = myvector.begin(); it != myvector.end(); ++it)
            std::cout << ' ' << *it;
        std::cout << '
    ';
    
        myvector.assign(mydoubles, mydoubles + 8);
    
        std::cout << "using 'compare_as_ints' :";
        std::stable_sort(myvector.begin(), myvector.end(), compare_as_ints);
        for (std::vector<double>::iterator it = myvector.begin(); it != myvector.end(); ++it)
            std::cout << ' ' << *it;
        std::cout << '
    ';
    
        return 0;
    }
    //输出:
    using default comparison: 1.32 1.41 1.62 1.73 2.58 2.72 3.14 4.67
    using 'compare_as_ints' : 1.41 1.73 1.32 1.62 2.72 2.58 3.14 4.67
    

      

  • 相关阅读:
    以太坊编程简单介绍 ,Part-1
    以太坊可更新智能合约研究与开发综述
    为你的以太坊应用程序设计架构
    货币的未来取决于打破关于货币历史的虚构谎言
    JVM调优:GC 参数
    JVM调优:GC 参数
    Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法
    Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法
    Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法
    Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法
  • 原文地址:https://www.cnblogs.com/noticeable/p/14862181.html
Copyright © 2020-2023  润新知