Implementações variadas à regra de Horner (Horner’s Rules)

Variadic functions são funções que aceitam um número arbitrário de argumentos. No C++, existe uma forma dinâmica de resolução deste tipo de função herdada do C através de variadic arguments. Além de outra, introduzida no C++ moderno, que é de resolução estática e baseada em templates, denominada de variadic templates.

Neste post, o objetivo é mostrar a implementação do método de Horner utilizando estas duas abordagens com variadic, uma que é resolvida em tempo de execução (variadic arguments) e outra em tempo de compilação (variadic templates).

Continuar lendo

Anúncios

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.

Continuar lendo

C, C++ e string: Uma combinação (quase) perfeita

As linguagens de programação C e C++ possuem uma relação. Praticamente vivem em harmonia e sintonia – mesmo existindo compiladores e padrões distintos. Essa combinação é que possibilita escrevermos abstrações “próximo ao metal”, estabelecendo um equilíbrio entre a compreensão (do código, que depende de ponto de vista e conhecimento) e o desempenho.

O problema é quando truques e hacks entram em ação. Um dos meus favoritos com C++ é sobrescrever no buffer de uma string. Isso é feito através do retorno do método c_str(), que disponibiliza um ponteiro para este buffer interno. No entanto, é necessário fazer um const_cast para remover o constness do ponteiro e assim sobrescreve-lo.

Os exemplos que elaborei para este post são uma tentativa de simular um problema real que me custou quase um dia inteiro de depuração, por causa de um hacking “metido a besta”. 🙂

Continuar lendo

Composição, parte 1 – com exemplo clássico do Unix

A idéia deste post é reproduzir a demonstração clássica feita por Brian Kernighan utilizando composição de pequenos programas através dos Unix pipelines. Ela é bem simples, porém muito significativa, se trata desta sequência:

makewords text_file | lowercase | sort | unique | mismatch dictionary_file

Onde o objetivo é identificar quais palavras do texto (text_file) são desconhecidas pelo dicionário (dictionary_file) informado:

Continuar lendo

Por quem os ponteiros dobram, estrelando std::accumulate

O std::accumulate é um algoritmo de operação numérica, da mesma forma que std::iota explorado anteriormente (http://simplycpp.com/2015/11/06/mestre-iota/), reside no header <numeric> da STL: http://www.cplusplus.com/reference/numeric/accumulate/.

Seu objetivo, até mesmo porque o nome desta função dá uma dica, é acumular elementos que pertencem a um range fornecido por um par de iterators (usualmente begin e end para uma sequência completa). O std::accumulate também possui um valor inicial para o acumulador que é fornecido como terceiro parâmetro desta função.

Supondo um array de tamanho 10 e já inicializado como container de referência para os exemplos a seguir:

Continuar lendo

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

Continuar lendo

Iterator com predicado, o que é isso?

O iterator é um objeto que aponta ou indica um elemento em uma extensão de elementos, tais como containers da STL (por exemplo: std::vector) ou um array.

A Standard Template Library (STL) possui uma boa variedade de containers ou coleções que podem armazenar elementos, onde uma das operações naturais sobre estes containers são as iterações – assim é possível percorrer ou visitar cada elemento presente. Certa vez, li uma definição do relacionamento entre os principais recursos da STL (iterators, algorithms e containers) que era algo do tipo: algorithms atuam em containers através de iterators. Esta é uma definição simplificada e válida do que chamamos de “STL-way”. Se tentar copiar elementos de um std::vector para outro std::vector, provavelmente utilizará um std::copy e passará um par de iterators (begin e end) para indicar a extensão a ser copiada, além de utilizar um outro iterator para indicar o destino:

Continuar lendo

Medindo o tempo do seu código

Uma das facilidades do padrão para o C++ moderno é a presença de construções que permitem a manipulação de data e tempo. Estes utilitários podem ser encontrados na biblioteca chrono, como você poderá conferir em algumas referências e documentações que se encontram disponíveis, como por exemplo, as minhas favoritas: Documentação do Visual C++, Cplusplus.com e Cppreference.com.

Neste post, vamos focar somente nos utilitários de tempo. O que você pode fazer com eles? É possível saber, através de um de seus relógios (system_clock, steady_clock, high_resolution_clock), sobre um determinado ponto de referência no tempo, como por exemplo, o “agora” através da função estática now.

Continuar lendo