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

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