map.erase (map.end ())?

Если кто-то отлаживает через Bluetooth и наткнулся на эту ветку, напишите:

adb -s localhost:4444 uninstall example.com.yourappname
21
задан MSalters 5 June 2009 в 08:24
поделиться

4 ответа

Для erase (key) стандарт говорит, что все элементы с ключом значения удаляются. Конечно, таких ценностей может и не быть.

Для стирания (it) (где it - это std :: map :: iterator ) в стандарте говорится, что элемент, на который он указывает, удаляется - к сожалению, если это end () , он не указывает на действительный элемент, и вы находитесь вне зоны undefined behavior , как если бы вы использовали end () для любой другой операции с картой. Для получения более подробной информации см. Раздел 23.1.2.

32
ответ дан 29 November 2019 в 06:52
поделиться

end () не является интегратором в карту. Фактически это «один за концом» карты.

Версия с «итератором» требует, чтобы итератор выполнял какие-либо действия на карте.
«Ключевая» версия стирания выполняет поиск и защищает себя от того, что ключ не найден, версия итератора предполагает, что вы не пытаетесь что-то сломать.

18
ответ дан 29 November 2019 в 06:52
поделиться

Вместо примера, приведенного в предыдущем посте ...

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;

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

3
ответ дан 29 November 2019 в 06:52
поделиться

Вот быстрый пример того, как я использую карту 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));
}

Надеюсь, это поможет!

1
ответ дан 29 November 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: