Como faço para escrever um loop que itera sobre uma CAtlMap apagar seletivamente elementos como vai?
Pergunta
Eu estou tentando fazer o seguinte sem código caso muito especial para lidar com cargos invalidados etc:
Qual é a melhor maneira de preencher os espaços em branco?
void DeleteUnreferencedRecords(CAtlMap<Record>& records)
{
for(____;____;____)
{
if( NotReferencedElsewhere(record) )
{
// Delete record
_______;
}
}
}
Solução
De acordo com esta:
http://msdn.microsoft.com/ en-us / library / 0h4c3zkw (VS.80) .aspx
RemoveAtPos tem essa semântica
Remove o par chave / valor armazenado na posição especificada. A memória usada para armazenar o elemento é liberado. A posição referenciado por pos torna-se inválido, e enquanto a posição de quaisquer outros elementos no mapa permanece válido, eles não necessariamente manter a mesma ordem.
O problema é que a ordem pode mudar - o que significa que GetNext () realmente não vai continuar a iteração. Parece que você precisa coletar as posições que deseja excluir em uma passagem e excluí-los na próxima. A remoção de uma posição não invalida os outros objetos POSIÇÃO
Outras dicas
Meu primeiro pensamento seria a salvar a posição atual antes de chamar GetNext
, então, se você excluir o elemento que você pode redefini-la. No entanto, talvez a forma mais segura seria a criação de um novo mapa que contém os elementos que você deseja manter, então você pode estar contando com a forma como a implementação interna de obras posição.
Eu não estou muito familiarizado com CAtlMap
, mas se é semelhante ao tipo map
do STL, em seguida, o Rob "primeiro pensamento" é seguro - excluir um item não afeta nenhum iterators exceto o (s) apontando para o item a ser excluído.