[英]How to create a class that accepts a comparator (for Max Heap and Min Heap)?
[英]How does the following comparator even works while building up the min heap?
我知道,如果我使用STL構建堆,則會生成max_heap。 如果要創建min_heap,則必須編寫自己的自定義比較器。 現在,下面的比較器
struct greater1{
bool operator()(const long& a,const long& b) const{
return a>b;
}
};
int main() {
std::vector<long> humble;
humble.push_back(15);
humble.push_back(15);
humble.push_back(9);
humble.push_back(25);
std::make_heap(humble.begin(), humble.end(), greater1());
while (humble.size()) {
std::pop_heap(humble.begin(),humble.end(),greater1());
long min = humble.back();
humble.pop_back();
std::cout << min << std::endl;
}
return 0;
}
上面的代碼是我從互聯網上獲得的。 我只是有一個疑問。 比較器實際上如何工作。 據我了解,不應該這樣, return a < b
因為我們希望最小的元素在前面,然后在堆中更大的元素。 為什么return a > b
。 這不是意味着, if (a>b)
,則返回true,並且a
將在b
之前放入堆中,因此將較大的元素放在較小的元素之前?
我認為您對比較器語義和堆語義之間的聯系了解得太多了。 請記住,容器的內部細節和結構是故意從您那里抽象出來的,因此,當您開始嘗試根據您認為max_heap
的內部結構的外觀對此進行合理化時,您就被帶走了。
在標准庫中,默認比較器始終 less-than
。 如果要在特定容器/算法中進行排序的元素之間的關系不less-than
,則容器/算法將足夠聰明以進行該轉換(在這種情況下,對於通常的實現,只需簡單地以相反的順序傳遞操作數,像cmp(b,a)
!)。 但是,從根本上講,它將始終以less-than
順序開頭,因為這是所采用的一致慣例。
因此,要反轉容器的順序,無論容器實現的物理布局(您認為)是什么,您都將使用less-than
比較器並將其變為greater-than
比較器。
此外,順便說一句,為了回應新月形面包的評論,我會花long
的時間…,實際上,僅使用std::greater
而不是重新創建它。
標准堆的構建方式是,對於每個元素a
及其子b
,比較cmp(b,a)
成立,其中cmp
是提供的比較器。 請注意, cmp
的第一個參數是child 。 (或者,從內部表示抽象,標准的方法是,使cmp(top, other)
是用於第一元件真top
和任何其他other
)。
顯然,這樣做是為了使默認比較器(“較少”)建立最大堆。
因此,您需要提供一個比較器,當提供第一個參數作為子代時,您想返回true。 對於最小堆,這將是“更大”的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.