Как сравнить элементы тела std :: map? - PullRequest
0 голосов
/ 13 апреля 2011

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

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

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

Если для типов, используемых в качестве ключа и значений, определено 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;
}
1 голос
/ 15 апреля 2011
struct foo 
{
   // foo members
};

bool isEqual(const std::map<int,foo>& map1, const std::map<int,foo>& 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 foo& f1, const foo& f2)
{
   // some implementation that checks if f1 and f2 are equal
}

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

bool isEqual(const std::map<int,foo>& map1, const std::map<int,foo>& 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;
}

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

0 голосов
/ 13 апреля 2011

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

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 
       }
}

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

...