我有一組結構,其中結構是
struct sub_tree
{
vector <int> nodes;
int weight;
};
和比較器函式的集合是
set <sub_tree, decltype (comp)*> s(comp);
bool comp (sub_tree a, sub_tree b)
{
return (a.weight < b.weight);
}
現在,當我輸入兩個具有相同權重但節點向量不同的結構時,例如 weight1 = 96 node1 = 5 和 weight2 = 96 node2 = 6 它只接受集合中的第一個。但是,如果我使用以下比較器,則它接受這兩個值。
set <sub_tree, decltype (comp)*> s(comp);
bool comp (sub_tree a, sub_tree b)
{
return (a.weight <= b.weight);
}
有人可以解釋這種行為嗎?
uj5u.com熱心網友回復:
的比較物件set必須符合比較命名要求。這意味著
equiv(a, b), 等價于的運算式!comp(a, b) && !comp(b, a)
即,如果應用具有原始順序和交換順序的函式都回傳 false,則認為兩個值相同。
的契約std::set::insert指定如果集合中已經存在相等的物件,則不會對集合進行修改。對于第一次比較,這被認為是這種情況。
第二個不符合比較的要求。
讓我們假設上面參考的要求適用于您的比較函式:傳遞 2 個相等的值a1和a2.
comp(a1, a2)是truecomp(a2, a1)是true
所以根據Compare的要求a1和a2不一樣,這是矛盾的。因此違反了要求。
如果你想在一個集合中存盤多個具有相同權重的元素,你需要引入一個決勝局或者使用一個 std::multiset
uj5u.com熱心網友回復:
我相信這是因為您正在使用有序集。因此,它正在尋找的函式應該回傳 <0、0 和 >0。你的函式簡單地回傳 true 和 false,它被隱式轉換為 0 或 1。當你回傳 false 時,它??被解釋為 0,意思是,專案是相等的,意思是,因為它是一個集合,只有第一個專案應該是包括。當您回傳 true 時,它??被解釋為 1,即 >0,因此它解釋為,第一個大于第二個,因此包括兩者,但將第二個放在第一個之前(假設默認排序是升序,我認為是)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328471.html
標籤:C
上一篇:除錯斷言失敗-C ,使用智能指標
下一篇:如何使用插入排序對向量進行排序?
