Как мне сравнить элементы тела std::map?

#c #stl #map #comparison #compare

#c #stl #словарь #сравнение #Сравнить

Вопрос:

Я сохраняю структуру B, основанную на ключе A в stl::map. Я пишу код, который на основе любых обновлений любого элемента тела вышеупомянутой карты из старых значений, я выведу предупреждение.

Я понятия не имею, как это сделать. Я исследовал Интернет. Буду признателен за любую помощь. Спасибо.

Комментарии:

1. Чтобы прояснить вопрос, вы хотите получить код, который вызовет какое-то предупреждение (какого типа?), если объект, находящийся внутри карты, изменится? Какие обстоятельства должны вызвать это предупреждение? Каким должно быть предупреждение?

2. Одна поправка к названию вопроса — stl::map . Еще одно исправление к вопросу заключается в том, что если какой-либо элемент структуры B, который является телом карты, изменяется, как мне это обнаружить? для этого уже доступен вызов или я должен проверять элемент за элементом с помощью if (b.x == b.second.x) ? Спасибо

3. @DavidRodriguez, Нет, я просто хочу знать, как мне обнаружить изменение, я просто выполню printf после того, как обнаружу изменение. Итак, моя проблема в следующем: существует ли вызов функции для обнаружения (истинного или ложного типа) chnage в любом из элементов тела карты с прошлого раза?? Имеет ли это смысл сейчас?

4. Я проголосовал за закрытие , поскольку вопрос, похоже, не связан с рассматриваемой проблемой. После прочтения комментариев пользователей к ответу Тони кажется, что вопрос должен быть примерно таким: «Могу ли я сравнить две структуры, не выполняя все сравнения по элементам?» или что-то связанное. Текущий вопрос фокусируется на std::map том, что не имеет отношения к проблеме, и, таким образом, сбивает с толку. Фактическим вопросом было бы отсутствие информации о том, что такое фактическая структура (это модуль? какие типы он содержит?)

Ответ №1:

Если operator== определены типы, используемые в качестве ключа и значений, самым простым и дорогостоящим решением является сохранение резервной копии карты, а затем сравнение обеих карт:

 std::map<key,value> the_map;
std::map<key,value> test_copy; // hidden from the rest of the code
                               // copied from the_map on particular instants
bool map_has_changed() {
   return the_map != test_copy;
}
  

Ответ №2:

 struct foo 
{
   // foo members
};

bool isEqual(const std::map<int,foo>amp; map1, const std::map<int,foo>amp; map2)
{
   std::map<int,foo>::const_iterator itr1, itr2;
   for (itr1 = map1.begin(), itr2 = map2.begin(); itr1 != map1.end(), itr2 != map2.end(); itr1  , itr2  )
   {
      if (itr1->first != itr2->first) return false;
      if (!isEqual(itr1->second, itr2->second)) return false;
   }
   return true;
}

bool isEqual(const fooamp; f1, const fooamp; f2)
{
   // some implementation that checks if f1 and f2 are equal
}
  

Недостатком этой реализации является то, что она предполагает, что элементы каждой карты расположены в одном и том же порядке (что означает, что они вставляются в том же порядке). Если они могут быть в другом порядке, то вам нужно будет сделать что-то подобное для std::map isEqual:

 bool isEqual(const std::map<int,foo>amp; map1, const std::map<int,foo>amp; map2)
{
   std::map<int,foo>::const_iterator itr, temp;
   for (itr = map1.begin(); itr != map1.end(); itr  )
   {
      temp = map2.find(itr->first);
      if (!temp) return false;
      if (!isEqual(itr->second, temp->second)) return false;
   }
   return true;
}
  

Первая реализация будет быстрее, но опять же, предполагается, что карта находится в том же порядке.

Ответ №3:

Вы должны повторить карту и выполнить сравнение:

 std::map<int, std::string> my_map;
int someint = 2;
std::string mystr = "tony";
std::map<int, std::string>::iterator it;

for (it = my_map.begin(); it != my_map.end() it  )
{
    if (it->first == someint) 
      { 
          //do something 
      }

    if (it->second == mystr) 
       { 
         // do something else 
       }
}
  

Убедитесь, что если ваша карта содержит пользовательские объекты, то операторы сравнения реализованы должным образом.

Комментарии:

1. моя карта — std::map<int, someStructwithManyMembers> my_map;

2. @user: если вы не упомянули об этом в своем вопросе, то я бы не знал, принцип все тот же, однако

3. Я думаю, что я не очень хорошо объясняю свой вопрос: я думаю, что мой вопрос заключается в том, что если у меня есть stl::map<int, somestructure> mymap1 и stl ::map <int, somestructure> mymap2, то есть ли оптовый способ (для lakc лучшего слова) сравнить mymap1.somestructure с mymap2.somestructure без необходимости сравнивать member по memeber. Заранее благодарю вас за помощь.

4. @user553514: То есть, по сути, вы задаете вопрос, который совершенно не связан с картой, но озаглавлен вопросом «как сравнить элементы тела std::map»? Половина пути к ответу — это предоставление фактического вопроса, который вас интересует.