• vector系列--使用sort算法对vector<unique_ptr<string>>进行排序(sort函数“应输入 2 个参数,却提供了 3 个)


    之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法。

    今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序。

    #include<iostream>
    #include<string>
    #include<vector>
    #include<algorithm>
    #include<memory>
    bool compare_int(int  &lhs, int  & rhs)
    {
        return  lhs > rhs;
    }
    bool compare_first_letter(const std::unique_ptr<std::string > &lhs, const std::unique_ptr<std::string > & rhs)
    {
        return  ((*lhs) < (*rhs));
    }
    
    bool compare_unique_ptr_int(  std::unique_ptr<int > &lhs,   std::unique_ptr<int > & rhs)
    {
        return  *lhs < *rhs;
    }
    
    //bool compare_by_uniqptr(const unique_ptr<int>& a,
    //  const unique_ptr<int>& b) {
    //  return *a < *b;
    //}
    
    
    int main()
    {
        //sort vector<int>
        std::vector<int> int_vector;
        int_vector.push_back(5);
        int_vector.push_back(4);
        int_vector.push_back(3);
        int_vector.push_back(6);
        int_vector.push_back(9);
    
        for (int i = 0; i < int_vector.size(); i++)
        {
            std::cout << int_vector[i] << " ";
        }
        std::cout << std::endl;
    
        sort(int_vector.begin(), int_vector.end(), compare_int);
        for (int i = 0; i < int_vector.size(); i++)
        {
            std::cout << (int_vector[i]) << " ";
        }
        std::cout << std::endl;
    
        // sort vector<unique_ptr<string>>
        std::vector<std::unique_ptr<std::string>> unique_ptr_string_vector;
        std::unique_ptr<std::string> unique_ptr_string(new std::string("adr"));
        unique_ptr_string_vector.push_back(std::move(unique_ptr_string));
    
    
        std::unique_ptr<std::string> unique_ptr_string8(new std::string("abc"));
        unique_ptr_string_vector.push_back(std::move(unique_ptr_string8));
    
    
        std::unique_ptr<std::string> unique_ptr_string7(new std::string("abr"));
        unique_ptr_string_vector.push_back(std::move(unique_ptr_string7));
    
        std::unique_ptr<std::string> unique_ptr_string6(new std::string("aar"));
        unique_ptr_string_vector.push_back(std::move(unique_ptr_string6));
    
        std::unique_ptr<std::string> unique_ptr_string2(new std::string("ebr"));
        unique_ptr_string_vector.push_back(std::move(unique_ptr_string2));
    
        std::unique_ptr<std::string> unique_ptr_string3(new std::string("dbr"));
        unique_ptr_string_vector.push_back(std::move(unique_ptr_string3));
    
        std::unique_ptr<std::string> unique_ptr_string4(new std::string("cbr"));
        unique_ptr_string_vector.push_back(std::move(unique_ptr_string4));
    
        std::unique_ptr<std::string> unique_ptr_string5(new std::string("bbr"));
        unique_ptr_string_vector.push_back(std::move(unique_ptr_string5));
    
        for (int i = 0; i < unique_ptr_string_vector.size(); i++)
        {
            std::cout << *(unique_ptr_string_vector[i]) << " ";
        }
        std::cout << std::endl;
    
        sort(unique_ptr_string_vector.begin(), unique_ptr_string_vector.end(), compare_first_letter);
        for (int i = 0; i < unique_ptr_string_vector.size(); i++)
        {
            std::cout << *(unique_ptr_string_vector[i]) << " ";
        }
        std::cout << std::endl;
    
        //sort vector<unique_ptr<int>>
        std::vector<std::unique_ptr<int>> v;
        std::unique_ptr<int> unique_ptr_int(new int(5));
        v.push_back(std::move(unique_ptr_int));
    
        std::unique_ptr<int> unique_ptr_int1(new int(4));
        v.push_back(std::move(unique_ptr_int1));
    
        std::unique_ptr<int> unique_ptr_int2(new int(3));
        v.push_back(std::move(unique_ptr_int2));
    
        std::unique_ptr<int> unique_ptr_int3(new int(6));
        v.push_back(std::move(unique_ptr_int3));
    
        std::unique_ptr<int> unique_ptr_int4(new int(9));
        v.push_back(std::move(unique_ptr_int4));
        for (int i = 0; i < v.size(); i++)
        {
            std::cout << *v[i] << " ";
        }
        std::cout << std::endl;
    
        //sort(std::make_move_iterator(v.begin()), std::make_move_iterator(v.end()), compare_unique_ptr_int);
    
        //for (auto i = v.begin(); i != v.end(); i++)
        //{
        //  std::cout << **i << " ";
        //}
        //std::cout << std::endl;
    
        sort(v.begin(), v.end(), compare_unique_ptr_int);
        for (auto i = v.begin(); i != v.end(); i++)
        {
            std::cout << **i << " ";
        }
        std::cout << std::endl;
    
    
    
        return 0;
    }
    
    //输出:
    5 4 3 6 9
    9 6 5 4 3
    adr abc abr aar ebr dbr cbr bbr
    aar abc abr adr bbr cbr dbr ebr
    5 4 3 6 9
    3 4 5 6 9
    

      

    其实还很简单的,但是对于在类中使用sort算法进行排序,需要注意一些问题。

    你很能会遇到这样的错误:
    sort函数出错“应输入 2 个参数,却提供了 3 个。

    在类中你写了比较函数:

    bool compare_unique_ptr_int(  std::unique_ptr<int > &lhs,   std::unique_ptr<int > & rhs)
    {
        return  *lhs < *rhs;
    }
    

      

    然后在类的某个成员函数中,使用了sort方法进行排序,第三个参数使用compare_unique_ptr_int函数,这个时候就会出现上面所说的错误。

    但是如何改进呢?
    方法有两种:

    方法一:把compare_unique_ptr_int函数改为静态方法:

    static bool compare_unique_ptr_int(  std::unique_ptr<int > &lhs,   std::unique_ptr<int > & rhs)
    {
        return  *lhs < *rhs;
    }
    
    sort(v.begin(), v.end(), compare_unique_ptr_int);
    

    方法二:使用lambda表达式进行

    sort(v.begin(), v.end(), [](std::unique_ptr<int > &lhs,   std::unique_ptr<int > & rhs)(){return  *lhs < *rhs;});
    

      这样就大功告成了!!!

  • 相关阅读:
    中国剩余定理
    exgcd(扩展欧几里得)求同余式
    hdu 4557 :非诚勿扰(vector + 二分)
    ZOJ 1094:Matrix Chain Multiplication(栈)
    ZOJ1004: Anagrams by Stack(dfs + 栈模拟)
    洛谷 P1038 :神经网络(BFS && 拓扑排序)
    51Nod 1459:迷宫游戏(Dijkstra)
    51 Nod 1640: 天气晴朗的魔法(Krustra 并查集)
    打印文件中的内容
    print directory(打印目录)
  • 原文地址:https://www.cnblogs.com/noticeable/p/14862192.html
Copyright © 2020-2023  润新知