簡體   English   中英

關於std :: sort的比較函數對象

[英]About the comparison function object of std::sort

在下面的兩個示例中:示例1:

struct less_than_key
{
    inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
    {
        return (struct1.key < struct2.key);
    }
};

std::vector < MyStruct > vec;

vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));

std::sort(vec.begin(), vec.end(), less_than_key());  //LINE1

范例2:

std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; 
struct {
    bool operator()(int a, int b)
    {   
        return a < b;
    }   
} customLess;
std::sort(s.begin(), s.end(), customLess);        //LINE2

為什么LINE1的比較函數對象具有“()”,即less_than_key()? LINE2的比較函數對象沒有“()”,即customLess?

第1行帶有括號,因為它正在創建less_than_key類的實例,並將其作為參數傳遞(即,它是一個值)。

第2行沒有括號,因為它已經是所提供的匿名結構的一個實例(即,它已經是一個值)。

std::sort希望比較器對象的一個​​實例正常工作,因此您有時可以就地構造它們或提供一個已經構造的對象。

在示例1中,您聲明了一個名為less_than_key的結構,但是您沒有該結構的任何實例,只有一個聲明。 在LINE 1中,您將調用struct的構造函數,並創建要由std :: sort函數使用的對象的實例。

在示例2中,情況有所不同。 您還聲明了一個結構,這次沒有名稱(匿名),但是區別在於您正在創建這種類型的實例“ customLess”(隱式調用構造函數)。 因此,既然已經創建了實例,則無需在std :: sort函數中創建它。

看一下結構聲明中的區別:

1.-結構less_than_key {...};

2.-結構[some_name_if_wanted] {...} customLess ;

std::sort需要一個比較函數對象 在第一個示例中,您正在構造一個對象。 在第二個示例中,您已經有一個。 最簡單的例子是查看透明的比較器,即std::less<>() ,它是一個類模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM