Обеспечение меньше, чем оператор для одного элемента пары

Что было бы самым изящным, слишком исправляют следующий код:

#include <vector>
#include <map>
#include <set>
using namespace std;

typedef map< int, int > row_t;
typedef vector< row_t > board_t;
typedef row_t::iterator area_t;

bool operator< ( area_t const& a, area_t const& b ) {
    return( a->first < b->first );
};

int main( int argc, char* argv[] )
{
    int row_num;
    area_t it;

    set< pair< int, area_t > > queue;
    queue.insert( make_pair( row_num, it ) ); // does not compile
};

Один способ зафиксировать его перемещает определение меньше <к станд. пространства имен (я знаю,  Вы, как предполагается, не делаете это.)

namespace std {
    bool operator< ( area_t const& a, area_t const& b ) {
        return( a->first < b->first );
    };
};

Другое очевидное решение определяет меньше, чем <для пары <интервал, area_t>, но я хотел бы избежать, что и смочь определить оператор только для одного элемента пары, где это не определяется.

6
задан Paul Fleming 18 October 2012 в 20:19
поделиться

1 ответ

Когда вы реализуете компаратор, который реализует какой-то специфический и/или довольно экзотический подход к сравнению, лучше использовать именованную функцию или объект функции вместо того, чтобы использовать для этой цели оператор <. Я бы сказал, что естественным способом сравнения объектов std::pair было бы использование лексикографического сравнения. Поскольку ваше сравнение не является лексикографическим, использование оператора < может быть не очень хорошей идеей. Лучше реализовать класс компаратора

typedef pair< int, area_t > Pair; // give it a more meaningful name

struct CompareFirstThroughSecond {
  bool operator ()(const Pair& p1, const Pair& p2) const { 
    if (p1.first != p2.first) return p1.first < p2.first;
    return p1.second->first < p2.second->first;
  }
};

и использовать его с вашим контейнером

std::set< Pair, CompareFirstThroughSecond > queue;  

(надеюсь, я правильно расшифровал ваше намерение из вашего исходного кода).

Вы также можете реализовать вышеупомянутый метод operator () как метод шаблона, что сделает его пригодным для всех std::pair-базированных типов с итератором в качестве второго члена. Однако это может не иметь большого смысла, поскольку ваше сравнение достаточно "экзотично".

6
ответ дан 17 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: