Какие требования должны соответствовать classам classов std :: map?

Я хочу сопоставить объекты данного classа объектам другого. Однако class, который я хочу использовать как ключ, не был написан мной и представляет собой простую struct с несколькими значениями. std :: map заказывает его содержимое, и мне было интересно, как он это делает, и если какой-либо произвольный class можно использовать в качестве ключа или если существует набор требований (операторов, а что нет), которые необходимо определить.

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

Все, что требуется от ключа, состоит в том, что оно может быть гибким и назначаемым. Порядок в карте определяется третьим аргументом шаблона (и аргументом для конструктора, если он используется). По умолчанию используется std::less , по умолчанию используется оператор < , но нет необходимости использовать значения по умолчанию. Просто напишите оператор сравнения (желательно как функциональный объект):

 struct CmpMyType { bool operator()( MyType const& lhs, MyType const& rhs ) const { // ... } }; 

Обратите внимание, что он должен определять строгий порядок, т. CmpMyType()( a, b ) Если CmpMyType()( a, b ) возвращает true, то CmpMyType()( b, a ) должен возвращать значение false, и если оба возвращают false, элементы считаются равными (члены тот же class эквивалентности).

Вам нужно определить оператор <, например:

 struct A { int a; std::string b; }; // Simple but wrong as it does not provide the strict weak ordering. // As A(5,"a") and A(5,"b") would be considered equal using this function. bool operator<(const A& l, const A& r ) { return ( la < ra ) && ( lb < rb ); } // Better brute force. bool operator<(const A& l, const A& r ) { if ( la < ra ) return true; if ( la > ra ) return false; // Otherwise a are equal if ( lb < rb ) return true; if ( lb > rb ) return false; // Otherwise both are equal return false; } // This can often be seen written as bool operator<(const A& l, const A& r ) { // This is fine for a small number of members. // But I prefer the brute force approach when you start to get lots of members. return ( la < ra ) || (( la == ra) && ( lb < rb )); } 

Ответ на самом деле находится в ссылке, которую вы ссылаетесь, в описании аргумента шаблона «Сравнить».

Единственное требование заключается в том, что Compare (который по умолчанию less , который по умолчанию использует operator< для сравнения ключей), должен быть «строгим слабым упорядочением».

То же, что и для set : class должен иметь строгий порядок в духе «меньше». Либо перегрузите соответствующий operator< или создайте собственный предикат. Любые два объекта a и b для которых !(aa) будут считаться равными.

Контейнер карты фактически сохранит все элементы в порядке, обеспечиваемом этим заказом, таким образом вы сможете достичь O (log n) поиска и времени вставки по значению ключа.

  • Почему std :: string не подразумевает преобразование в char *?
  • Как удалить элементы из контейнеров STL?
  • std :: string форматирование, подобное sprintf
  • Почему я не могу создать вектор ссылок?
  • Что стандартная библиотека гарантирует самопереключение?
  • Как скопировать одну карту в другую с помощью std :: copy?
  • Как я могу сортировать карту STL по значению?
  • std :: string в многопоточной программе
  • Создание карты :: поиск недействителен
  • Зачем использовать начальные и конечные функции не-членов в C ++ 11?
  • Есть ли готовая готовая к запуску очередь или хеш-реализация в C ++
  • Interesting Posts

    Получение java.sql.SQLException: операция не разрешена после закрытия ResultSet

    Температура процессора очень горячая в BIOS, но в режиме RealTemp / Speedfan

    Windows 8 «chkdsk / r» застрял на стадии 4

    Базовые элементы (@ManagedBean) или CDI Beans (@Named)?

    DisplayFormat ApplyFormatInEditMode

    Понимание ошибок ограничения значения F #

    Настройка сочетаний клавиш хрома

    Как свойство сжатия Windows 7 влияет на другие методы сжатия?

    Ошибка компиляции Xcode 7: «Ошибка команды из-за сигнала: Ошибка сегментации: 11″

    Скажите aptitude игнорировать сломанный пакет

    Почему hashCode () возвращает одно и то же значение для разных объектов в Java?

    Перенаправить stdout в файл, когда процесс выполняется в фоновом режиме

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

    Как добавить новую строку в datagridview программно

    Что такое хорошая встроенная firebase database для использования с C #?

    Давайте будем гением компьютера.