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

来源:互联网 发布:php无限极分类简书 编辑:程序博客网 时间:2024/09/21 09:00

之前博客写了对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 99 6 5 4 3adr abc abr aar ebr dbr cbr bbraar abc abr adr bbr cbr dbr ebr5 4 3 6 93 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;});

这样就大功告成了!!!

2 0