考虑下面的自定义类型使用排序比较不同的功能和复制与性病检查::设为
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说 –