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:
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:
e isso seria usado da seguinte forma:
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
E agora precisamos criar o nosso método de lookup.
O retorno será um CashRange, contendo um begin/end implementados.
Agora, para mostrarmos o resultado usaremos o range-based for desta forma:
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