簡體   English   中英

為什么選擇STL <set> 重載運算符&lt;函數必須是const函數嗎?

[英]Why STL <set> the overload operator < function must be a const function?

class Test
{

public:

    int v;
    Test(int s)
    {
        v = s;
    }

    bool operator < (const Test & b) const
    {
        return v < b.v;
    }
};

int main()
{
    set <Test> t2;
    return 0;
}

重載less運算符時,為什么必須使用const函數? 如果我不在那里寫“ const”,它將不會通過編譯。 所以我不知道為什么我必須在那里寫“ const”?

原因是std::set有點特殊:它存儲的值不得更改(同樣, std::mapkey_type )。 這是因為set是一個排序的容器,它需要知道如何對值進行排序。 更改集合中的值可能會導致程序損壞,因為set::set無法知道值已更改,因此需要重新排序。

如果允許比較函數修改值,則永遠不能使用它,因為集合中的值始終是const。

順便說一句,確實可以對值進行一些修改,特別是那些不影響排序順序的修改。 因此,如果您有一個帶有自定義排序功能的集合,該集合按結構的一個字段排序,則可以修改結構的其他字段,因為排序順序將保持不變。 但是std::set無法了解哪些字段對排序順序很重要,哪些字段對排序順序不重要,因此整個值都是const。 您可以做一些技巧,例如使某些字段mutable以解決此問題,但是在大多數情況下,這是沒有必要的(例如,您可以改用地圖,而將可修改的部分放在value_type )。

您不需要這樣做。 通常建議這樣做,因為在比較對象的過程中不應修改對象。 set<Test>通過將const引用傳遞給operator<來使其成為必需項。

暫無
暫無

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

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