Joao brandao Posted March 27, 2012 at 05:26 PM Report #445987 Posted March 27, 2012 at 05:26 PM 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
pikax Posted March 27, 2012 at 06:30 PM Report #445992 Posted March 27, 2012 at 06:30 PM 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."
mogers Posted March 27, 2012 at 06:45 PM Report #445994 Posted March 27, 2012 at 06:45 PM 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.
jpaulino Posted March 27, 2012 at 07:54 PM Report #446002 Posted March 27, 2012 at 07:54 PM Atenção ao titulo dos tópicos criados!
pikax Posted March 27, 2012 at 08:54 PM Report #446005 Posted March 27, 2012 at 08:54 PM 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."
mogers Posted March 27, 2012 at 10:43 PM Report #446035 Posted March 27, 2012 at 10:43 PM 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.
pikax Posted March 27, 2012 at 11:04 PM Report #446041 Posted March 27, 2012 at 11:04 PM 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."
Joao brandao Posted March 27, 2012 at 11:17 PM Author Report #446043 Posted March 27, 2012 at 11:17 PM obrigada pela ajuda 😁 ja percebi para que serve os iteradores 🙂 tenho é de me habituar a usar mais vezes
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now