2012-04-07 1 views
3

я столкнулся с ошибкой со следующим кодомC++ станд :: карта сравнить метод

struct MapKey { 
    std::string x; 
    std::string y; 
} 

std::map<MapKey, int> m; 

if (m.find(key) != m.end()) { 
    ...... 
} 

Я получаю говорит об ошибке,

no match for "operator<" in '__x < __y' 

Я считаю, что проблема заключается в том, что MapKey необходимо иметь сравнение метод, мне интересно, как я могу реализовать его для Mapkey. Например,

struct MapKey { 
    bool operator<(const MapKey &key) const { 
     ... what shall I put here? ... 
    } 
    std::string x; 
    std::string y; 
} 

Спасибо.

ответ

9

Определить это после MapKey «s определения (как свободная функция, а не функция члена), и вы установите:

bool operator <(MapKey const& lhs, MapKey const& rhs) 
{ 
    return lhs.x < rhs.x || lhs.x == rhs.x && lhs.y < rhs.y; 
} 

Убедитесь определить оператор, как inline если определение находится в заголовке файл, иначе вы рискуете ошибками компоновщика.

+0

Спасибо за ваш ответ. Есть ли какая-то особая причина, по которой определить оператор <как свободную функцию, но не как функцию-член MapKey? Благодарю. – 2607

+0

@ 2607: Это технически возможно, но, как правило, для операторов, которые не являются функциями-членами (например, операторами присваивания), функции-члены считаются плохой практикой. – ildjarn

2

Любая функция (которая может принимать аргументы const), которая индуцирует strict weak ordering, в порядке. Также помните, что вам не нужен оператор ==, но два ключа a и b считаются эквивалентными тогда и только тогда (a < b) & &! (B < a).

+0

Вот еще одна отличная статья о том, что означает строгий слабый порядок /: [Заказ я говорю!] (Http://cpp-next.com/archive/2010/02/order-i-say/) – ildjarn

 Смежные вопросы

  • Нет связанных вопросов^_^