Перегрузка == оператор в unordered_set

Я пытаюсь создать 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);
}

Я получаю ошибки о нескольких определениях ==

У кого-нибудь есть идеи, как мне это решить? Помощь очень ценится!

3

Решение

Поместите это в шапку:

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);
}

В то время как вы можете создать равенство лямбда, в этом случае это равенство имеет смысл для общего равенства.

Единственное, о чем я должен быть осторожен, это то, что ваш == не полное равенство. Если один Interval отличается только updated или же patternIndex от другого и имейте коллизию хешей, они будут молча перезаписывать другого.

1

Другие решения

Изменить IntervalEquality::operator== в operator(), Затем определите ваш unordered_set вот так:

unordered_set<Interval, Hash, IntervalEquality> test;

Проблема в том, что вы определили, что должно быть областью имен operator== как функция-член. Операторы равенства области имен получают 2 аргумента и сравнивают их. Операторы равенства функций-членов берут 1 аргумент и сравнивают его с классом, которому он принадлежит.

3

По вопросам рекламы [email protected]