Range loops – Escrevendo código seguro

Eu estava olhando um código de um sistema e me deparei com um trecho que me fez torcer o nariz. O código funcionava, mas imediatamente vi dois problemas potenciais:

  1. Bug de int/unsigned int
    1. Um vector::size() – 1
    2. Se size for 0, o resultado será 4294967295 ou 0xFFFFFFFF!
  2. Código confuso e facilmente quebrável
    1. msgs[count] – Não tem offset dinâmico
    2. Um count inválido pode quebrar o programa

Eu suponho que a pessoa que desenvolveu o código fez dessa forma para pegar os itens que estavam no vector, excluindo os itens da borda (0:n), mas como seria essa implementação da forma STL de se programar ?

Continuar lendo

Anúncios

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)
Continuar lendo