我正在使用一个非常简单的结构,映射,定义如下:
struct mapping{
int code;
string label;
bool operator<(const mapping& map) const {
return code < map.code;
}
bool operator==(const mapping& map) const {
return label.compare(map.label) == 0 ;
}
};
我想创建一组按他们的代码排序的映射。为此,我重载了 < 运算符。它工作正常。我可以毫无问题地插入一些具有不同标签的映射。
当我尝试插入具有相同代码但不同标签的映射时,问题就来了。实际上,在该过程的第二步中,我不知道之前是否插入了具有相同标签的映射。所以,我需要调用 find() 函数来确定是否是这种情况。如果没有插入相同标签的映射,没关系,我只需要插入这个新的(但它的代码将暂时与其他映射相同)。如果存在一个具有相同标签的映射,我只需要更新它的代码。我虽然像我所做的那样重载 == 运算符就足够了,但事实并非如此,如下面的代码所示。
mapping m = {1,"xxx"};
mapping m2 ={1, "yyy"};
this->fn[0].insert(m);
set<mapping>::iterator itTmp;
itTmp = this->fn[0].find(m2);
if (itTmp != this->fn[0].end() ) {
cout << "m2 exists "<<endl;
if ( !(*itTmp == m2) ){
cout << "But it is different according to the definition of the == operator "<<endl;
}
}
相关的输出是:
m2 exists
But it is different according to the definition of the == operator
我该如何解决这个问题并设法处理具有非常不同语义的运算符 < 和 ==?理想情况下,我想避免在整个集合上进行迭代以寻找具有相同标签的映射。这种策略的复杂性是 O(n) 并且 n 在我的应用程序中可能非常大。与 find() 的复杂性类似,我更喜欢 O(log n) 中的解决方案。
谢谢,
约安