Если кто-то отлаживает через Bluetooth и наткнулся на эту ветку, напишите:
adb -s localhost:4444 uninstall example.com.yourappname
Для erase (key)
стандарт говорит, что все элементы с ключом значения удаляются. Конечно, таких ценностей может и не быть.
Для стирания (it)
(где it
- это std :: map :: iterator
) в стандарте говорится, что элемент, на который он указывает, удаляется - к сожалению, если это end ()
, он не указывает на действительный элемент, и вы находитесь вне зоны undefined behavior , как если бы вы использовали end ()
для любой другой операции с картой. Для получения более подробной информации см. Раздел 23.1.2.
end ()
не является интегратором в карту. Фактически это «один за концом» карты.
Версия с «итератором» требует, чтобы итератор выполнял какие-либо действия на карте.
«Ключевая» версия стирания выполняет поиск и защищает себя от того, что ключ не найден, версия итератора предполагает, что вы не пытаетесь что-то сломать.
Вместо примера, приведенного в предыдущем посте ...
MapType::iterator it = the_map.find ("new_key");
// Does not exist.
if (it == the_map.end()) {
the_map.insert (std::make_pair ("new_key", 10));
}
, который выполняет два обхода дерева, используйте ...
pair<MapType::iterator, bool> rc = the_map.insert(make_pair("new_key", 0));
if (rc.second)
rc.first.second = 10;
Таким образом вы выполняете один обход дерева и у вас есть итератор готовы к прочему.
Вот быстрый пример того, как я использую карту STL с итераторами при удалении. То же самое делаю и при вставке. Лично мне нравится использовать typedef для определения карты, но выбор за вами.
typedef std::map... MapType;
MapType the_map;
MapType::iterator it = the_map.find ("key");
if (it != the_map.end()) {
// Do something productive.
the_map.erase (it);
}
MapType::iterator it = the_map.find ("new_key");
// Does not exist.
if (it == the_map.end()) {
the_map.insert (std::make_pair ("new_key", 10));
}
Надеюсь, это поможет!