2016-10-15 1 views
0

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

struct number_pair 
{ 
    int a; 
    int b; 
    bool operator<(const pair& other) const { return ?; } 
} 

Вы должны иметь возможность сортировать несколько экземпляров структуры с помощью оператора. Порядок должен уважать как a, так и b. Я не хочу использовать библиотеки, отличные от std, и я на C++ 98, поэтому std::tuple недоступен.

Можно ли достичь того, что я хочу, если два типа данных имеют только те операторы, которые имеют более низкий, чем и равный? Если это так, как будет выглядеть реализация оператора, а в противном случае, что еще вам нужно знать о типах данных для реализации оператора?

+0

'вернуть this-> а б OneOfOne

+1

'return a '). – Cornstalks

+0

@OneOfOne Я думаю, вы правы, что это означает, что 'A timakro

ответ

3

Вы хотите lexicographical comparison. Для этого есть функция C++: std::lexicographical_compare. Этот алгоритм является тем же, что используется для сортировки объектов std::tuple.

Вы можете легко осуществить это самостоятельно (без std::lexicographical_compare) как так:

struct pair { 
    int a; 
    int b; 
    bool operator<(const pair& other) const { 
     return a < other.a || (a == other.a && b < other.b); 
    } 
}; 

В качестве альтернативы, вы можете использовать std::pair<int, int>, чтобы сделать это. Он уже получил лексикографический порядок operator<.

3

Чтобы помочь разобраться в базовой концепции, рассмотрим более простой случай сравнения двух текстовых строк. Спросите себя, как вы сравниваете две строки? Вы должны знать ответ: сравнить первый символ каждой строки. Если они одинаковы, перейдите к второму символу и так далее. Я оставляю детали обработки строк, которые различаются по длине, но это базовая концепция.

Здесь понятие точно так же, если вы считаете, что у вас всегда есть строка два символа, и мысленно подставлять два персонажа с вашим a и b:

bool operator<(const pair& other) const { 
    if (a != other.a) 
     return a < other.a 
    return b < other.b; 
} 

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

bool operator<(const pair& other) const { 
    if (a < other.a) 
     return true; 
    if (other.a < a) 
     return false; 
    return b < other.b; 
} 
0

Хотя std::tuple могут быть недоступны, вы можете использовать boost::tuple и boost::tie:

#include <boost/tuple/tuple.hpp> 
#include <boost/tuple/tuple_comparison.hpp> 

struct number_pair 
{ 
    int a; 
    int b; 
    bool operator<(const number_pair& other) const { 
     return boost::tie(a, b) < boost::tie(other.a, other.b); 
    } 
};