Pular para o conteúdo principal

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:

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

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

Postagens mais visitadas deste blog

Mestre Iota

Iota é a nona letra do alfabeto grego, ela é equivalente à letra i do nosso alfabeto. Por convenção ou hábito, utilizamos a letra i na programação para indicar algum tipo de incrementador, como por exemplo, em um for-loop . https://gist.github.com/fabiogaluppo/a23894ae743f7dd29274 Curiosamente, iota , como identificador, também é utilizado na programação para indicar uma sequência finita e consecutiva de números inteiros, como por exemplo, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Inclusive, originalmente na STL existia a função iota , inspirada pela linguagem de programação APL , você pode conferir neste link: http://www.sgi.com/tech/stl/iota.html

Valores Aleatórios Simplificados

A partir do C++ 11, foi introduzido o header <random>  com diversos facilitadores para suporte de geração de números aleatórios. A produção destes números é feita através da combinação de duas categorias de objetos: os geradores e os distribuidores. Os geradores, são responsáveis pela geração dos números, e os distribuidores são responsáveis pela transformação dos números gerados em algum tipo de distribuição de probabilidade.  Como por exemplo, uma distribuição normal (aquela da Gaussiana) ou uma distribuição de Pareto (aquela do 80-20). As opções não faltam, como você pode ver nas referências, por exemplo:   http://www.cplusplus.com/reference/random/ ou  http://en.cppreference.com/w/cpp/header/random .

Policy-based design: log writer

Policy-based design Vamos neste artigo dar mais uma pincelada no Policy-based design . Vamos fazer como exemplo uma classe de log. Como este é só um exemplo, não vamos considerar múltiplos parâmetros no log, mas somente uma string, assim não fugiremos do assunto. Uma das coisas mais importantes neste tipo de design é o desacoplamento. Ele é uma excelente alternativa ao uso de interfaces por duas razões: Não gera chamadas virtuais (ou um nível de indireção em tempo de execução) Duck typing ( https://pt.wikipedia.org/wiki/Duck_typing ) Eu gosto bastante desse tipo de design, já usado aqui: http://simplycpp.com/2016/02/05/leitura-de-configuracao-em-c/