3

我正在尝试创建一个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); 
}

我收到关于多个定义的错误==

有谁知道我该如何解决这个问题?非常感谢帮助!

4

2 回答 2

3

将 更改IntervalEquality::operator==operator()。然后像这样定义你的unordered_set

unordered_set<Interval, Hash, IntervalEquality> test;

问题是您将命名空间范围operator==定义为成员函数。命名空间范围相等运算符接受 2 个参数并比较它们。成员函数相等运算符采用 1 个参数并将其与所属的类进行比较。

于 2013-04-08T01:52:37.973 回答
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仅与另一个不同updatedpatternIndex与另一个不同并且有哈希冲突,它们将默默地覆盖另一个。

于 2013-04-08T02:17:20.627 回答