Как я могу перегрузить оператор сравнения для набора пар?

Как я могу перегрузить и передать < (меньше) компаратор для набора пар целых чисел? Это мой текущий код:

class A{
public:
typedef std::pair<int, int> pair_type;

bool operator<(const pair_type& a, const pair_type& b){
if (a.first < b.first) return true;
else if ( (a.first == b.first) && (a.second < b.second) ) return true;
else return false;
}

private:
std::set< pair_type > edge_;
};

Если я пытаюсь скомпилировать этот код, я получаю следующую ошибку:

error: 'bool A::operator<(const pair_type&, const pair_type&)' must take exactly one argument

Как я могу это исправить?

2

Решение

class A{
public:
typedef std::pair<int, int> pair_type;

struct compare {
bool operator()(const pair_type& a, const pair_type& b) {
if (a.first < b.first) return true;
else if ( (a.first == b.first) && (a.second < b.second) ) return true;
else return false;
}
};

private:
std::set<pair_type, compare> edge_;
};
5

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

Ваш оператор должен быть свободной функцией (не членом-функцией), так как он не имеет никакого отношения к A учебный класс.

2

Вы должны определить перегрузку оператора как член класса (с одним параметром, обычно другим экземпляром того же класса):

class pair_type : public std::pair<int, int>
{
public:
bool operator<(const pair_type &comp) const
{
if (this->first < comp.first) return true;
else if ( (this->first == comp.first) && (this->second < comp.second) ) return true;
else return false;
}
};
2

поскольку C ++ 11, Вы также можете использовать лямбда-выражение вместо определения структуры компаратора:

using pair_type = std::pair<int, int>;

auto comp = [](const pair_type& a, const pair_type& b) {
return (a.first < b.first) || ((a.first == b.first) && (a.second < b.second));
};

Я также сжал ваш код компаратора, чтобы сохранить две строки. Теперь вы можете определить свой набор следующим образом:

std::set<pair_type, decltype(comp)> edge_(comp);

Однако, если вы хотите использовать вышеупомянутый компаратор для набора, который является членом класса, то это немного менее удобно, потому что вы также должны передать компаратор в конструктор множества, как показано выше.
Это означает, что вы должны передать компаратор в списке инициализатора определения конструктора:

class A{
public:
A() : edge_(comp) {}

private:
std::set<pair_type, decltype(comp)> edge_;
};

Код на Ideone

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