程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 實戰c++中的vector系列--使用sort算法對vector(unique_ptr(string))進行排序(sort函數出錯“應輸入 2 個參數,卻提供了 3 個)

實戰c++中的vector系列--使用sort算法對vector(unique_ptr(string))進行排序(sort函數出錯“應輸入 2 個參數,卻提供了 3 個)

編輯:C++入門知識

實戰c++中的vector系列--使用sort算法對vector(unique_ptr(string))進行排序(sort函數出錯“應輸入 2 個參數,卻提供了 3 個)


之前博客寫了對vector使用sort算法進行的排序,之前也寫到過vector>的一些處理方法。

今天就寫一下對vector>使用sort算法進行排序。

#include
#include
#include
#include
#include
bool compare_int(int  &lhs, int  & rhs)
{
    return  lhs > rhs;
}
bool compare_first_letter(const std::unique_ptr &lhs, const std::unique_ptr & rhs)
{
    return  ((*lhs) < (*rhs));
}

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

//bool compare_by_uniqptr(const unique_ptr& a,
//  const unique_ptr& b) {
//  return *a < *b;
//}


int main()
{
    //sort vector
    std::vector 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>
    std::vector> unique_ptr_string_vector;
    std::unique_ptr unique_ptr_string(new std::string("adr"));
    unique_ptr_string_vector.push_back(std::move(unique_ptr_string));


    std::unique_ptr unique_ptr_string8(new std::string("abc"));
    unique_ptr_string_vector.push_back(std::move(unique_ptr_string8));


    std::unique_ptr unique_ptr_string7(new std::string("abr"));
    unique_ptr_string_vector.push_back(std::move(unique_ptr_string7));

    std::unique_ptr unique_ptr_string6(new std::string("aar"));
    unique_ptr_string_vector.push_back(std::move(unique_ptr_string6));

    std::unique_ptr unique_ptr_string2(new std::string("ebr"));
    unique_ptr_string_vector.push_back(std::move(unique_ptr_string2));

    std::unique_ptr unique_ptr_string3(new std::string("dbr"));
    unique_ptr_string_vector.push_back(std::move(unique_ptr_string3));

    std::unique_ptr unique_ptr_string4(new std::string("cbr"));
    unique_ptr_string_vector.push_back(std::move(unique_ptr_string4));

    std::unique_ptr 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>
    std::vector> v;
    std::unique_ptr unique_ptr_int(new int(5));
    v.push_back(std::move(unique_ptr_int));

    std::unique_ptr unique_ptr_int1(new int(4));
    v.push_back(std::move(unique_ptr_int1));

    std::unique_ptr unique_ptr_int2(new int(3));
    v.push_back(std::move(unique_ptr_int2));

    std::unique_ptr unique_ptr_int3(new int(6));
    v.push_back(std::move(unique_ptr_int3));

    std::unique_ptr 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 &lhs,   std::unique_ptr & rhs)
{
    return  *lhs < *rhs;
}

然後在類的某個成員函數中,使用了sort方法進行排序,第三個參數使用compare_unique_ptr_int函數,這個時候就會出現上面所說的錯誤。

但是如何改進呢?
方法有兩種:

方法一:把compare_unique_ptr_int函數改為靜態方法:

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

sort(v.begin(), v.end(), compare_unique_ptr_int);

方法二:使用lambda表達式進行

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

這樣就大功告成了!!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved