Jump to content

funçao dos iteradores


Joao brandao
 Share

Recommended Posts

Boas,  estava aqui a ver algumas coisinhas de c++ e surgiu me a seguinte duvida, qual é a funçao dos iteradores?

Um exercicio com iteradores:


#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n,num;
    vector<int>vec;
cout<<"Escreva quantos numeros quer ler ";
cin>>n;
for(int i=0;i<n;i++)
{
cin>>num;
vec.push_back(num);
}    
vector<int>::iterator it=vec.begin();
for(int i=0;i<n;i++)
{
        cout<<*it<<endl;
        it+=1;
}

system("pause");
    return 0;
}

O mesmo exercicio sem iteradores:


#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n,num;
    vector<int>vec;
cout<<"Escreva quantos numeros quer ler ";
cin>>n;
for(int i=0;i<n;i++)
{
cin>>num;
vec.push_back(num);
}    
for(int i=0;i<n;i++)
{
        cout<<vec[i]<<endl;
}

system("pause");
    return 0;
}

Consigo fazer as mesma coisa sem usar iterador, sera que existe outras funçoes para o uso de iteradores?

(se estiver um pouco confuso avisem me para voltar a escrever o texto)

Cumprimentos,

Joao Brandao

Link to comment
Share on other sites

Os iteratores servem para ser mais rapido o acesso aos containers:

os iteratores funcionam assim:

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();++it)
{
        cout<<*it<<endl;
}

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Os iteratores servem para ser mais rapido o acesso aos containers

Mais rápido em que sentido? E em que te baseias para dizer isso?

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Mais rápido em que sentido? E em que te baseias para dizer isso?

Posso citar aqui fontes se quiseres...

"The most obvious form of iterator is a pointer: A pointer can point to elements in an array, and can iterate through them using the increment operator (++). But other forms of iterators exist. For example, each container type (such as a vector) has a specific iterator type designed to iterate through its elements in an efficient way."

Se o meu inglês não estiver mal, penso que "efficient way" seja de forma eficiente, se é eficiente penso que se pode considerar mais rápido do que um apontador dito normal, já que um iterator está construido de forma a que o acesso aos dados de um determinado container seja mais "rápido".

Posso ter me precipitado e ter dito algo que não seja mesmo verdade, já que estava com um bocado de presa na altura que escrevi.

EDIT: Só se aplica, se quisermos verificar todos os elementos, se queremos aceder a um determinado elemento será melhor usar o "find" ou o operador []/at()

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Se o meu inglês não estiver mal, penso que "efficient way" seja de forma eficiente, se é eficiente penso que se pode considerar mais rápido do que um apontador dito normal, já que um iterator está construido de forma a que o acesso aos dados de um determinado container seja mais "rápido".

A minha pergunta deveu-se essencialmente por se estar a exemplificar o uso de iteradores em vectores.

Na minha opinião, "efficient way" significa de facto uma forma eficiente, mas discordo do resto da tua frase - não é dito que é mais rápido do que um apontador normal. No caso de um vector, penso que nem sequer faz sentido que usar um objecto de uma classe iterador seja mais rapido do que usar um normal apontador (tanto mais porque a implementação do iterador deve usar um apontador internamente). Mesmo desprezando o overhead do uso de um objecto, a operação ++ do iterador terá um custo computacional idêntico a fazer o cálculo "apontador+posição*sizeof(tipo_dados)" ( vec[ i ] == vec + i*sizeof(int) ).

Um caso completamente diferente seria falar de uma lista ou de uma árvore. Nesse caso o custo do ++ é um custo "constante" - O(1), enquanto que o acesso aos elementos por uma função ".at(pos)" tem um custo O(N). Aqui de facto o iterador compensa se pretendermos iterar por todos os elementos.

Voltando à questão do post original. Na minha opinião, os iteradores servem para iterar sobre uma colecção de objectos, de uma forma simples e transparente para o programador, sendo que não é necessário preocuparmo-nos com a implementação. A forma de utilização dos iteradores é igual para qualquer classe da STL.

O caso do vector é talvez demasiado simples e quase não se justifica, mas implementar um iterador para a classe "set" (implementado através de uma árvore binária de pesquisa) não é coisa de 2 ou 3 linhas.

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Estás certo, para um simples vector, onde a memoria é está "contínua" na memoria , isto é, o próximo elemento está a seguir ao elemento anterior(na memória), não faz assim tanta diferença usar um apontador(em termos de "performance").

Já agora, com a tua resposta penso que o Joao brandao deve ficar esclarecido

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.