考慮下面的自定義類型使用排序比較不同的功能和複製與性病檢查::設爲
struct custom_type {
int c[5];
float w;
}
我能以某種方式定義std::set<custom_type>
使得該組中的元素之間的排序是通過比較.w
完成但如果兩個元素在.c
字段上匹配,則它們被認爲是等同的?
我知道通常有一個用於排序的比較函數,如果!comp(a, b) && !comp(b, a)
有兩個元素是等價的,但也許有一種解決方法。
考慮下面的自定義類型使用排序比較不同的功能和複製與性病檢查::設爲
struct custom_type {
int c[5];
float w;
}
我能以某種方式定義std::set<custom_type>
使得該組中的元素之間的排序是通過比較.w
完成但如果兩個元素在.c
字段上匹配,則它們被認爲是等同的?
我知道通常有一個用於排序的比較函數,如果!comp(a, b) && !comp(b, a)
有兩個元素是等價的,但也許有一種解決方法。
不,這是不可能的。比較功能必須建立一個total order。 std::set
需要訂單和工作operator <
找到O(log(N))時間複雜度中的元素。
舉一個例子,假設你有一組(1a,3b,5c,7d,9e,11f)。該號碼是您的訂購float w
,字母表示int c[5]
的平等。你想找到5f。根據你的定義,5f等於11f。如果std::set
已經對元素3b和7d進行了測試,則期望5f在它們之間,並且不會在其他地方進行搜索。現在,如果5c不等於5f,則std::set
將永遠不會找到該元素。
如果你能確保當int c[5]
是平等的,float w
也是平等的,你可以使用由w
下令std::multiset
。 equal_range
返回兩個迭代器,您可以使用它來查找也匹配的元素c
等同性通過運算符==定義,而順序關係由運算符定義 – Vivick
Vivick std :: set總是使用較少(或運營商<)進行比較和質量測試。例如,可以通過'!(a
是的,這就是http://en.cppreference.com/w/cpp/container/set說 –