beginner_intermediate

Range against the machine

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:
interval

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

Leave a Reply

Your email address will not be published. Required fields are marked *