Как написать цикл for, который перебирает CAtlMap, выборочно удаляя элементы по ходу? - PullRequest
0 голосов
/ 13 октября 2008

Я пытаюсь сделать следующее без особого кода особого случая, чтобы иметь дело с недействительными ПОЛОЖЕНИЯМИ и т. Д .:

Какой лучший способ заполнить пробелы?

void DeleteUnreferencedRecords(CAtlMap<Record>& records)
{
   for(____;____;____)
   {
      if( NotReferencedElsewhere(record) )
      {
        // Delete record
        _______;
      }
   }
}

Ответы [ 3 ]

2 голосов
/ 13 октября 2008

Согласно этому:

http://msdn.microsoft.com/en-us/library/0h4c3zkw(VS.80).aspx

RemoveAtPos имеет следующую семантику

Удаляет пару ключ / значение, сохраненную в указанной позиции. Память, используемая для хранения элемента, освобождается. POSITION, на который ссылается pos, становится недействительным, и хотя POSITION любых других элементов на карте остается действительным, они не обязательно сохраняют тот же порядок.

Проблема в том, что порядок может измениться - это означает, что GetNext () действительно не продолжит итерацию. Похоже, вам нужно собрать ПОЗИЦИИ, которые вы хотите удалить за один проход, и удалить их в следующий. Удаление POSITION не делает недействительными другие объекты POSITION

0 голосов
/ 13 октября 2008

Я не слишком знаком с CAtlMap, но если он похож на тип map STL, то "первая мысль" Роба безопасна - удаление элемента не влияет на итераторы кроме тех, которые указывают на удаляемый элемент.

0 голосов
/ 13 октября 2008

Моими первыми мыслями было бы сохранить текущую позицию перед вызовом GetNext, а затем, если вы удалите элемент, вы можете сбросить его. Однако, возможно, самый безопасный способ - создать новую карту, содержащую элементы, которые вы хотите сохранить, иначе вы могли бы полагаться на то, как работает внутренняя реализация POSITION.

...