2017-09-23 84 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