WedX - журнал о программировании и компьютерных науках

Использование собственного оператора Comparator() для карты‹›. Выдает ошибку в случае, если KEY не найден

Я попытался реализовать собственный оператор и использовать его в map‹>, код выглядит следующим образом:

#include <iostream>
#include <map>
#include <string>

using namespace std;

struct keyInfo
{
  string Key1; 
  string Key2; 

  /*bool keyInfo::operator()(keyInfo const& Left,keyInfo const& Right) const{
      return ((Left.Key1<Right.Key1)&&(Left.Key2<Right.Key2));
  }*/
};

struct LessComparer{
    bool operator()(keyInfo const& Left,keyInfo const& Right) const{
        return !(Left.Key1==Right.Key1 && Left.Key2==Right.Key2);
    }
};

struct valueInfo
{ 
  int value1; 
  int value2; 
  int value3; 

  valueInfo(const int A,const int B,const int C) : 
    value1(A),value2(B),value3(C) {}
};
typedef std::map<keyInfo, valueInfo, LessComparer> MapTYPE;

int main()
{
  MapTYPE TMap;
  keyInfo K;
  K.Key1="main";
  K.Key2="i";
  valueInfo V(-2,-3322,9000);

  TMap.insert(MapTYPE::value_type(K,V));
  MapTYPE::iterator It1=TMap.find(K);
  It1=TMap.find(K);
  if(It1!=TMap.end())
    std::cout<<"Success(K): "<<It1->second.value2<<std::endl;

  keyInfo E;
  E.Key1="main";
  E.Key2="j";
  //TMap.insert(std::pair<keyInfo,valueInfo>(E,V));
  MapTYPE::iterator It2=TMap.find(E);
  if (It2!=TMap.end())
     std::cout<<"Success(E): "<<(It2->second).value3<<std::endl;

  cin.get();
  return 0;
 }

Здесь я использую оператор(), чтобы вернуть 0, если оба Key1 и Key2 слева и справа равны. Я думаю, что это то же самое, как работает map::less, я имею в виду, что оно возвращает false, только если выполняется условие равенства.

Он отлично работает в первом случае, т. Е. TMap.find (K), где найден тот же ключ. Но во время вызова во втором случае, то есть TMap.find(E), появляется сообщение об ошибке:

"Debug assertion failed"
Expression: Invalid operator <

Ответы:


1

Оператор сравнения должен определять строгий слабый порядок. Вы можете написать такое сравнение для соединения сопоставимых типов с помощью лексикографического сравнения:

define "(a1, b1) < (a2, b2)" if and only if

   (a1 < a2) OR (a1 == a2 AND b1 < b2)

Это обобщается на произвольный кортеж (a1, b1, c1, ...) очевидным образом.

В C++ это должно быть записано следующим образом:

return (Left.key1 < Right.key1) ||
       (!(Left.key1 > Right.key1) && (Left.key1 < Right.key1));

Таким образом, вы можете определить лексикографический порядок для любого кортежа типов, используя только существующий <-оператор для каждого составного типа. (Обратите внимание, что в этом порядке два элемента x и y считаются эквивалентными, если !(x < y) && !(y < x).)

10.03.2012
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]