簡體   English   中英

C ++中自定義對象和運算符重載的比較

[英]Comparison of custom objects and operator overloading in C++

閱讀有關如何在C ++中的自定義對象進行比較的問題。 我不明白這里使用的運算符重載。 這里的操作員過載了什么? 是嗎 ()? 重載有什么用?

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
};

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

重點是使用less_than_key對象作為函數:

less_than_key f;
bool result = f(key1, key2);

其可以被稱為等功能(包括花園各種功能)對象有時被稱為仿函數 (警告:這不是在數學算符的意思),或功能的對象 ,或有時functoid的

許多標准庫算法和容器都希望將此類函數對象作為參數。 例如, std::map可以使用二進制函數對象(與您向我們展示的那個完全一樣)進行自定義,以了解如何對鍵進行排序。

請參閱此初學者的書籍清單,並閱讀有關標准算法和容器的信息,以了解可以在哪里使用這些野獸。

函數對象和迭代器是C ++標准庫的核心,您應該真正了解它們以充分利用C ++。

operator()是一個函數調用運算符,可能最常用的用法是允許您在對象上使用普通的函數調用語法,該語法可以被視為以“類似於函數”的方式運行。

在此示例中,您可以調用STL排序所使用的less_than_key()。

這稱為函子。 這在C ++ API中大量使用。 這些API中有一些采用函子來執行特定於對象的操作。

Example pseudo code:

- Sorting a list of MyStruct objects.

sort api in algorithm.
std::list<MyStruct> mystructlist;
// populate mystructlist
sort(mystructlist.begin(), mystructlist.end(), less_than_key);

它通常稱為“ functor”運算符,它很有用,因為它模仿對常規函數的調用語法。

具有此類重載運算符的對象通常與stl算法(例如std::find_if()std::sort()

以下是一些示例:

std::vector<MyStruct> myvector;

less_than_key comparator;
std::sort(myvector.begin(), myvector.end(), comparator);

要么:

MyStruct a, b;
less_than_key comparator;

if (comparator(a, b))
  // Do something
else
  // Do something else.

如您所見,調用less_than_key實例的operator()方法和調用具有相同原型的函數之間沒有語法上的區別(嗯,不考慮隱藏的this參數)。

暫無
暫無

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

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