Qual é a diferença entre iterators em Java e C ++?

votos
4

Como é a implementação de Iterator em Java diferente daquele em C ++?

Publicado 19/05/2009 em 14:44
fonte usuário
Em outras línguas...                            


5 respostas

votos
8

No actual C ++ (98) de biblioteca padrão (em particular, a porção anteriormente conhecido como STL) define uma forma de iterators que estão muito próximos aos ponteiros C (incluindo aritmética). Como tal, apenas um ponto em algum lugar. Para ser útil, você geralmente precisa de dois ponteiros para que você possa interagir entre eles. Eu entendo C ++ 0x apresenta faixas que agem mais como iterators Java.

Java introduzido o Iterator(e ListIteratorinterface) em 1,2, em grande parte, assumindo a partir da mais detalhado Enumerable. Java não tem aritmética de ponteiro, por isso não há necessidade de se comportar como um ponteiro. Eles têm um hasNextmétodo para ver se eles têm ir até o fim, em vez de exigir dois iteradores. A desvantagem é que eles são menos flexíveis. O sistema requer métodos que subList, em vez de iteração entre dois iterators são pontos específicos na lista que contém.

A diferença geral no estilo é que enquanto o uso C ++ "polimorfismo estático" através de modelos, Java usa interfaces e polimorfismo dinâmica comum.

O conceito de iterators é fornecer a cola para permitir a separação de "algoritmo" (realmente controlar o fluxo) e contentor de dados. Ambas as abordagens fazer isso razoavelmente bem. Em situações ideais código "normal" deve mal ver iteradores.

Respondeu 19/05/2009 em 15:07
fonte usuário

votos
6

C ++ não especificar como iteradores são implementadas. Isto, contudo, especificar a sua interface e o comportamento mínimo eles devem fornecer, a fim de trabalhar com outros componentes biblioteca padrão.

Por exemplo, para iterators de entrada, o padrão especifica que uma iteração deve ser dereferenceable através do operador *. No entanto, não especificam como esse operador é para ser implementado.

Respondeu 19/05/2009 em 14:47
fonte usuário

votos
2

Em C ++, você vê as pessoas passando em torno iteradores o tempo todo. C ++ iterators "ponto" a um elemento específico de um recipiente. Você pode excluir a referência um iterador para obter o elemento (e você pode fazer isso mais e mais). Você pode apagar o elemento que um iterador refere-se a eficiência. Você também pode fazer cópias de um iterador (quer através da atribuição a outra variável, ou passar um iterador por valor para uma função) para manter o controle de vários lugares ao mesmo tempo. Iterators em C ++ pode tornar-se "inválida" por certas operações no contentor, dependendo do recipiente. Quando um iterador torna-se invalidado (as regras do que pode ser complexo), as operações com o iterador tem um comportamento indefinido, e pode (de forma inconsistente) travar o seu programa ou retornar resultados incorretos; embora em algumas estruturas de dados (por exemplo,std::list), Iterators permanecem válidos através da maioria das modificações do recipiente.

Em Java, você não vê esse tipo de uso. Um Iterator em Java aponta "entre" dois elementos, em vez de "at" um elemento. A única maneira de obter elementos com um iterador é para movê-lo para a frente para obter o elemento que você se moveu sobre. Claro que altera o estado do iterador, e você não pode ir para trás; a menos que você tem umListIteratorcaso em que você pode se mover tanto para a frente e para trás (mas ainda é chato ter que mover-se para a frente e para trás apenas para permanecer imóvel). Você não pode copiar um iterador, porque a interface não expõe um método de cópia pública; assim, por exemplo, você não pode simplesmente passar um marcador de um local específico para uma função, sem dar essa função uma referência para o mesmo iterador que você tem, e permitindo-lhes para mudar o seu estado de iterador. Em Java, uma iteração serão invalidados (pelo menos nos recipientes padrão) por qualquer modificação do recipiente, excepto através da própria iteradoras add()ou remove()métodos, que é excessivamente conservadora (por exemplo, a maioria das modificações sobre um LinkedListnão deve afectar uma iteração). Quando você tenta usar um iterador invalidado, levantaConcurrentModificationException (Confusamente chamado porque ele não tem nada a ver com a Concorrência) em vez de possivelmente causando um comportamento indefinido, o que é bom.

Respondeu 19/05/2009 em 18:52
fonte usuário

votos
1

iterators C ++ (STL) tentam imitar sintaxe ponteiro, tanto quanto possível, através de sobrecarga de operador.

A especificação padrão definem os vários conceitos iteradoras (como para a frente, bidireccional, de acesso aleatório, de entrada, de saída). Cada conceito deve coincidir com uma interface específica (por exemplo operador ++ para iteração para a frente para ir para o elemento seguinte na sequência, - para bidireccional, +, + = para acesso aleatório, etc).

Respondeu 19/05/2009 em 14:50
fonte usuário

votos
0

implementações são definidas inteiramente por fornecedores biblioteca padrão / fornecedores JRE em C ++ / Java respectivamente. Eles são livres para implementá-las como quiserem, desde que o seu comportamento está em conformidade com as respectivas normas.

Respondeu 19/05/2009 em 14:49
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more