Стандартный идентификатор стирания ассоциативного контейнера:
for (auto it = m.cbegin(); it != m.cend() /* not hoisted */; /* no increment */)
{
if (must_delete)
{
m.erase(it++); // or "it = m.erase(it)" since C++11
}
else
{
++it;
}
}
Обратите внимание, что мы действительно хотим, чтобы обычный for
цикл здесь, так как мы модифицируем сам контейнер. Цикл, основанный на диапазоне, должен быть строго зарезервирован для ситуаций, когда мы заботимся только об элементах. Синтаксис RBFL делает это ясным, даже не подвергая контейнер внутри тела цикла.
Редактировать. Pre-C ++ 11, вы не могли стереть константы-константы. Там вы должны сказать:
for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }
Стирание элемента из контейнера не противоречит константе элемента. По аналогии, он всегда был совершенно законным delete p
, где p
является указателем на константу. Константа не ограничивает время жизни; константы в C ++ все еще могут перестать существовать.
Вы должны быть в состоянии отладить модулей , как Normal .
Либо вы не можете объяснить себя, либо вы смотрите не в том месте.