Uma característica do C++ moderno é o range-based for. Antes de falar de qualquer teoria e para que fique mais claro, segue um exemplo:
https://gist.github.com/thiagomg/f905126ca9da939cb715
O range-based for se baseia em intervalos e iteradores.
O que é um iterador em C++ ? Grosseiramente é um ponteiro que suporte aritmética de ponteiros (Ex: p++, p+=2, p2-p1, etc).
Um intervalo é um conjunto que contém duas extremidades como elementos, o inicial e o final. Em C++, um intervalo é semi-aberto a direita, contendo os iterators [begin, end)
Para lembrar - o padrão do C++ é sempre com o end aberto, ou seja:

Agora fica uma pergunta: Se os containers do C++ já tem os iteradores, qual seria a razão de eu fazer o meu próprio?
Imagine a seguinte classe:
https://gist.github.com/thiagomg/1f36c4a7f4f4dc533ed6
e isso seria usado da seguinte forma:
https://gist.github.com/thiagomg/73b6b1443c368fd7aef1
Se você estiver convencido que isso é muito útil, vamos em frente.
Para implementar o seu próprio begin e end, é necessário criar na sua classe um iterador e os métodos de intervalo
https://gist.github.com/thiagomg/ec2b45c5d326325b5600
E agora precisamos criar o nosso método de lookup.
https://gist.github.com/thiagomg/5d86f71a1f0b3ca1a96f
O retorno será um CashRange, contendo um begin/end implementados.
Agora, para mostrarmos o resultado usaremos o range-based for desta forma:
https://gist.github.com/thiagomg/3ce2e4bddc3546caa2cf
Simples e prático.
Já ouvi a pergunta:
- Mas usar o iterador não torna o código mais lento ou consome mais memória ?
Esta resposta ficará para um próximo artigo.
Fonte: https://github.com/SimplyCpp/examples/blob/master/range_for.cpp
https://gist.github.com/thiagomg/f905126ca9da939cb715
O range-based for se baseia em intervalos e iteradores.
O que é um iterador em C++ ? Grosseiramente é um ponteiro que suporte aritmética de ponteiros (Ex: p++, p+=2, p2-p1, etc).
Um intervalo é um conjunto que contém duas extremidades como elementos, o inicial e o final. Em C++, um intervalo é semi-aberto a direita, contendo os iterators [begin, end)
Para lembrar - o padrão do C++ é sempre com o end aberto, ou seja:
Agora fica uma pergunta: Se os containers do C++ já tem os iteradores, qual seria a razão de eu fazer o meu próprio?
Imagine a seguinte classe:
https://gist.github.com/thiagomg/1f36c4a7f4f4dc533ed6
e isso seria usado da seguinte forma:
https://gist.github.com/thiagomg/73b6b1443c368fd7aef1
Se você estiver convencido que isso é muito útil, vamos em frente.
Para implementar o seu próprio begin e end, é necessário criar na sua classe um iterador e os métodos de intervalo
https://gist.github.com/thiagomg/ec2b45c5d326325b5600
E agora precisamos criar o nosso método de lookup.
https://gist.github.com/thiagomg/5d86f71a1f0b3ca1a96f
O retorno será um CashRange, contendo um begin/end implementados.
Agora, para mostrarmos o resultado usaremos o range-based for desta forma:
https://gist.github.com/thiagomg/3ce2e4bddc3546caa2cf
Simples e prático.
Já ouvi a pergunta:
- Mas usar o iterador não torna o código mais lento ou consome mais memória ?
Esta resposta ficará para um próximo artigo.
Fonte: https://github.com/SimplyCpp/examples/blob/master/range_for.cpp
Comentários
Postar um comentário