#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»? Половина пути к ответу — это предоставление фактического вопроса, который вас интересует.