set
我们知道STL中自带了俩个方便的关于set的模板类供我们使用。
- set——红黑树底层
- unordered_set——hashtable底层
在遇到自定义结构体的时候,比如二维坐标点,我遇到了一些小小的问题。
问题
我的set中出现了重复的数据结构。
struct Data{
int x;
int y;
bool operator<(const Data&rhs)const
{
return x < rhs.x || y < rhs.y;
}
};
我当时定义了这么一种小于的方式。导致我的set出现了问题。
原因很简单。这个小于的定义方式有问题
假设(0, 5) 和 (5, 0) 比较,按照上面的规则(0, 5) 是小于(5, 0)
但是如果(5, 0) 和(0, 5)比较,按照上面的规则则(5, 0)小于(0, 5)显然这是矛盾的。
其中具体的数学规律我还不是很清楚,但是能给出一个指导性的意见
即在类似的比较中,我们要定义优先级。即我们认为x为第一优先级,只要x小就小。如果第一优先级无法比较,再去比较第二优先级。