Как написать цикл for, который перебирает CAtlMap, выборочно удаляя элементы по ходу?
Вопрос
Я пытаюсь сделать следующее без особого кода особого случая, чтобы иметь дело с недействительными ПОЛОЖЕНИЯМИ и т. д.
Как лучше всего заполнить пробелы?
void DeleteUnreferencedRecords(CAtlMap<Record>& records)
{
for(____;____;____)
{
if( NotReferencedElsewhere(record) )
{
// Delete record
_______;
}
}
}
Решение
В соответствии с этим:
http://msdn.microsoft.com/ ан-нас / библиотека / 0h4c3zkw (VS.80) .aspx
RemoveAtPos имеет эту семантику
Удаляет пару ключ / значение, сохраненную в указанной позиции. Память, используемая для хранения элемента, освобождается. POSITION, на который ссылается pos, становится недействительным, и хотя POSITION любых других элементов на карте остается действительным, они не обязательно сохраняют тот же порядок.
Проблема в том, что порядок может измениться - это означает, что GetNext () не будет продолжать итерацию. Похоже, вам нужно собрать ПОЗИЦИИ, которые вы хотите удалить за один проход, и удалить их в следующий. Удаление POSITION не делает недействительными другие объекты POSITION
Другие советы
Сначала я хочу сохранить текущее ПОЛОЖЕНИЕ перед вызовом GetNext
, а затем, если вы удалите элемент, вы можете сбросить его. Однако, возможно, самым безопасным способом было бы создать новую карту, содержащую элементы, которые вы хотите сохранить, иначе вы могли бы полагаться на то, как работает внутренняя реализация POSITION.
Я не слишком знаком с CAtlMap
, но если он похож на тип map
в STL, то