Pergunta

Em STL em quase todos os recipientes têm uma função de eliminação.A pergunta que eu tenho é em um vetor, a função de apagar retorna um iterador que aponta para o próximo elemento do vetor.O mapa recipiente não fazer isso.Em vez disso, ele retorna um vazio.Alguém sabe porque é que existe esta inconsistancy?

Foi útil?

Solução

Ver http://www.sgi.com/tech/stl/Map.html

O mapa tem a importante propriedade que inserir um novo elemento em um mapa não invalidam os iteradores que ponto para os elementos existentes.Apagar um elemento a partir de um mapa também não invalidar qualquer iteradores, exceto, claro que, para os iteradores que, na verdade, aponte para o elemento que está sendo apagados.

O motivo para o regresso de um iterador sobre a eliminação de modo que você pode iterar sobre a lista de apagar os elementos que você vá.Se apagar um item não invalidam existente iteradores não há necessidade de fazer isso.

Outras dicas

erase retorna um iterator em C++11.Isto é devido a relatório de defeitos 130:

Tabela 67 (23.1.1) diz que o recipiente::erase(iterator) retorna um iterador.Tabela 69 (23.1.2) diz que, além desse requisito, associativa recipientes de dizer também que o recipiente::erase(iterator) retorna void.Isso não é uma adição;é uma mudança de requisitos, que tem o efeito de tornar associativa recipientes não atender os requisitos para os contentores.

O comitê de padrões aceitos esta:

o LWG concorda com o tipo de retorno deve ser iterador, não nula.(Alex Stepanov concorda também.)

(LWG = Biblioteca de Grupo de Trabalho).

A inconsistência é devido ao uso. vector é uma sequência de ter uma ordenação sobre os elementos.Enquanto é verdade que os elementos de um map são também ordenados de acordo com algum critério de comparação, essa ordem é não-evidente, a partir da estrutura.Não existe nenhuma forma eficaz de obter a partir de um elemento para o próximo (eficiente = constante de tempo).Na verdade, para iterar sobre o mapa é muito caro;a criação de uma iteração ou o iterator em si envolve um pé sobre a árvore completa.Isso não pode ser feito em O(n), a menos que uma pilha é usada, caso em que o espaço necessário não é mais constante.

Tudo em tudo, simplesmente não existe maneira barata de devolver o "próximo" elemento depois de apagar.Para seqüências, há é uma maneira.

Além disso, Rob é certo.Não há nenhuma necessidade para o Mapa para retornar um iterador.

Só um detalhe, o STL fornecido com o MS Visual Studio C++ (Dinkumware IIRC) fornece um mapa de implementação com um erase função retornando um iterador para o próximo elemento.

Que nota de não conformidade com as normas.

Eu não tenho idéia se isso é a resposta, mas uma razão pode ser com o custo de localizar o próximo elemento.Iterar através de um mapa é inerentemente "lento".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top