簡體   English   中英

為什么這個程序重載()運算符?

[英]Why is this program overloading () operator?

目前我正在學習標准模板庫(STL)。

在這個程序中,我將一些長值存儲在Associative Container中,然后根據單位的位置對它們進行排序(根據單位的數量)。

代碼:

#include <iostream>
#include <set>
#include <functional>

using namespace std;

class UnitLess
{
public:
    bool operator()(long first, long second)
    {
        long fu = first % 10;
        long su = second % 10;

        return fu < su;
    }
};

typedef set<long, UnitLess> Ctnr;

int main(void)
{
    Ctnr store;

    store.insert(3124);
    store.insert(5236);
    store.insert(2347);
    store.insert(6415);
    store.insert(4548);
    store.insert(6415);

    for(Ctnr::iterator i = store.begin(); i != store.end(); ++i)
    {
        cout << *i << endl;
    }
}

但我不明白為什么我們的教授有重載()操作符?

謝謝。

UnitLess是一個二元謂詞 ,需要在STL中具有兩個參數可調用。

通過重載UnitLess的函數調用操作符,可以像使用兩個longs並返回bool的函數一樣使用該類型的實例。

UnitLess f;
f(5, 10);

相當於

bool f(long first, long second)
{
    long fu = first % 10;
    long su = second % 10;

    return fu < su;
}
f(5, 10);

該類的目的是實現一個以給定方式對集合中的元素進行排序的函數。 這被稱為謂詞。

它被實現為一個仿函數,即允許函數操作符在一個對象上使用(這就是std :: set在引擎蓋下做的事情)。 這樣做是STL和類似代碼調用自定義對象的常用方法。 (函數指針比函數對象(aka functor)更受限制

所以它的使用方式如下:

Unitless functor;

functor(123, 124); // returns true or false

std :: set是一個已排序的二叉樹,因此它會在每個插入上多次調用Unitless的()-operator來確定每個long值的位置。

嘗試編譯並在其中放置一些printf / std :: cout,看看會發生什么。

另外,請注意這樣的回調(即當您看不到對代碼的調用時)在學習曲線的開頭是可怕且令人困惑的。

  • 然后你習慣了它並且全部使用它們,因為它們很整潔。
  • 然后你的代碼再次變得可怕和混亂,你就像瘟疫一樣避開它們。
  • 然后你成為一個管道磁帶程序員,只在適當的地方使用它們,但從未在其他地方使用它們。

;)

他已經實現了一個用於std :: set的自定義比較,它只比較單位,即模數為10的數量。因為std :: set是一個模板,它只是試圖調用看起來像函數的東西,無論它是否是一個或不。 通過重載operator(),你可以使它像一個函數。

在某些情況下,這樣做實際上非常強大,因為struct / class可以存儲狀態以及額外的參數。 整個boost :: function / boost :: bind基於這樣做(並且你不需要每次都創建一個類)。

在編碼的實際例子中,可能存在輕微的缺陷,因為練習只是按單位對它們進行排序,但它可以很好地消除具有相同單位但實際上並不重復的數字。 在您的示例代碼中沒有這樣的示例(您有重復但是它是整個值的副本)。 如果除了4548之外還有3478,Set比較器會認為它們是相同的並且不允許復制。

順便說一下,我不確定set是什么叫做“關聯”容器,它指的是鍵值對。 集合中沒有關聯的值,只有鍵。

還有一點:operator()應該是const。

暫無
暫無

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

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