![](/img/trans.png)
[英]Why is this operator< overload function invisible to STL algorithms?
[英]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::map
的key_type
)。 這是因為set
是一個排序的容器,它需要知道如何對值進行排序。 更改集合中的值可能會導致程序損壞,因為set::set
無法知道值已更改,因此需要重新排序。
如果允許比較函數修改值,則永遠不能使用它,因為集合中的值始終是const。
順便說一句,確實可以對值進行一些修改,特別是那些不影響排序順序的修改。 因此,如果您有一個帶有自定義排序功能的集合,該集合按結構的一個字段排序,則可以修改結構的其他字段,因為排序順序將保持不變。 但是std::set
無法了解哪些字段對排序順序很重要,哪些字段對排序順序不重要,因此整個值都是const。 您可以做一些技巧,例如使某些字段mutable
以解決此問題,但是在大多數情況下,這是沒有必要的(例如,您可以改用地圖,而將可修改的部分放在value_type
)。
您不需要這樣做。 通常建議這樣做,因為在比較對象的過程中不應修改對象。 set<Test>
通過將const引用傳遞給operator<
來使其成為必需項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.