beginner_intermediate

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.

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

A função std::iota como é percebido foi (re)introduzida no C++ 11. Ela é definida no header <numeric>: http://www.cplusplus.com/reference/numeric/iota/. Seu propósito é fornecer uma sequência consecutiva dentro de um intervalo fornecido por um par de iterators [begin, end) a partir de valor inicial. A sequência consecutiva é gerada através da aplicação de uma função sucessora, que no caso geral é um pré-incremento, onde no C++ isto representa ++i.

Abaixo alguns exemplos do uso da função std::iota com uma diversidade de pares de iterator e valores iniciais:

Não seria interessante se estas sequências fossem alteradas, ou seja, se conseguíssemos alterar o comportamento da função sucessora de forma determinística ou não? E a resposta é sim! É possível alterarmos o comportamento padrão do operator++, uma vez que encapsulamos para um tipo convertível ao tipo do ForwardIterator indicado (os dois argumentos iniciais de std::iota são iterators, assim como a maioria dos algoritmos expostos pela STL), e este tipo tenha implementado o operador de pré-incremento. Algo como o tipo iota_step sugerido abaixo:

Você poderá utilizar o iota_step juntamente com std::iota da seguinte forma:

Ou se preferir utilizar uma função para construir o iota_step e se beneficiar da inferência do tipo:

Comentei acima que poderia fazer isto de forma não determinística, neste caso, que a função sucessora seja imprevisível ou aleatória. Basta seguir as mesmas considerações do iota_step e programar o operator++ com algum tipo de gerador de números pseudoaleatórios, como segue:

Assim você utilizará a característica básica de std::iota através de um comportamento estendido. Isto é divertido ou no mínimo curioso, não acha?

BTW, este post não é uma homenagem ao despertar da força! 😉

Fontes:
https://github.com/SimplyCpp/examples/blob/master/understanding_iota.hpp
https://github.com/SimplyCpp/examples/blob/master/understanding_iota_program.cpp

1 Comment

Leave a Reply

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