2017-09-23 64 views
0

考慮下面的自定義類型使用排序比較不同的功能和複製與性病檢查::設爲

struct custom_type { 
    int c[5]; 
    float w; 
} 

我能以某種方式定義std::set<custom_type>使得該組中的元素之間的排序是通過比較.w完成但如果兩個元素在.c字段上匹配,則它們被認爲是等同的?

我知道通常有一個用於排序的比較函數,如果!comp(a, b) && !comp(b, a)有兩個元素是等價的,但也許有一種解決方法。

+0

等同性通過運算符==定義,而順序關係由運算符定義 – Vivick

+1

Vivick std :: set總是使用較少(或運營商<)進行比較和質量測試。例如,可以通過'!(a

+0

是的,這就是http://en.cppreference.com/w/cpp/container/set說 –

回答

1

不,這是不可能的。比較功能必須建立一個total orderstd::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::multisetequal_range返回兩個迭代器,您可以使用它來查找也匹配的元素c