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

StackOverflow https://stackoverflow.com/questions/197121

  •  10-07-2019
  •  | 
  •  

Вопрос

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

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

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, то

scroll top