我正在尝试创建unordered_set
Intervals
定义如下:
struct Interval {
unsigned int b; //begining index
unsigned int e; //end index
bool updated; //true if concat. initially false
int patternIndex; //pattern index. valid for single pattern
int proteinIndex; //protein index. for retrieving the pattern
};
struct Hash {
size_t operator()(const Interval &interval) const;
};
struct IntervalEquality {
bool operator == (Interval const &lhs, Interval const &rhs);
};
bool IntervalEquality::operator == (Interval const &lhs, Interval const &rhs){
return ((lhs.b == rhs.b) && (lhs.e == rhs.e) && (lhs.proteinIndex == rhs.proteinIndex));
}
size_t Hash::operator()(const Interval &interval) const{
string temp = to_string(interval.b) + to_string(interval.e) + to_string(interval.proteinIndex);
return hash<string>()(temp);
}
unordered_set<Interval, Hash> test;
在这里,我在头文件中声明==
运算符并在我的.cpp文件中定义它(因为我成功地为其他运算符做了)。当我编译上面的代码时,我得到关于==
运算符只需要一个参数的错误。例如,'bool IntervalEquality::operator==(const Interval&, const Interval&)' must take exactly one argument
如果我尝试采用备用路由并在头文件中声明和定义==
,如下所示:
bool operator == (Interval const& lhs, Interval const& rhs){
return (lhs.b == rhs.b) &&
(lhs.e == rhs.e) &&
(lhs.proteinIndex == rhs.proteinIndex);
}
我收到有关==
有没有人知道如何解决这个问题?非常感谢!
答案 0 :(得分:3)
将IntervalEquality::operator==
更改为operator()
。然后像这样定义unordered_set
:
unordered_set<Interval, Hash, IntervalEquality> test;
问题在于您将命名空间范围operator==
定义为成员函数。命名空间范围相等运算符采用2个参数并进行比较。成员函数相等运算符使用1个参数并将其与属于的类进行比较。
答案 1 :(得分:1)
将其放在标题中:
bool operator== (Interval const& lhs, Interval const& rhs);
将它放在.cpp文件中:
bool operator== (Interval const& lhs, Interval const& rhs)
{
return (lhs.b == rhs.b) &&
(lhs.e == rhs.e) &&
(lhs.proteinIndex == rhs.proteinIndex);
}
虽然你可以创建一个相等的lambda,但在这种情况下,这种相等性对于一般的相等是有意义的。
我唯一要注意的是你的==
并非完全平等。如果一个Interval
仅与另一个updated
或patternIndex
不同并且发生哈希冲突,则它们将默默覆盖另一个。