Pergunta

Estou ciente das iterators alcance em impulso, e como para esta referência , parece que deve haver uma maneira fácil de fazer o que eu quero, mas não é óbvio para mim.

Digamos que eu queira representar uma gama numérica, de 0 a 100 (inclusive ou não), dizem range(0,100). Gostaria de fazer algo como:

for_each(range<int>(0,100).begin(), range<int>(0,100).end(), do_something);

onde do_something é um functor. Este iterators não deve ter a sobrecarga de ter um vetor de debaixo ou algo assim, mas apenas oferecer uma sequência de números inteiros. Isso é possível com a implementação gama no impulso? Possível a todos com, iteradores STL padrão normais?

Foi útil?

Solução

boost :: counting_iterator

#include <boost/iterator/counting_iterator.hpp>

std::for_each( boost::counting_iterator<int>(0),
               boost::counting_iterator<int>(100),
               do_something );

Outras dicas

Só para acrescentar às outras respostas, se você está vindo de um C ++ 11 perspectiva - se você preferir usar moderno para-cada loops, você pode fazer isso ainda mais limpa com boost counting_range :

#include <boost/range/counting_range.hpp>

for(auto const &i : boost::counting_range(0, 10)) {
  std::cout << i;
}

Saídas:

0123456789

Sim, é possível. Parece apenas boost :: gama não tem suporte para ele fora da caixa, mas você pode

  • usar boost::counting_iterator , que faz exatamente o que você quer
  • implementar um número semelhante objeto cuja operator*() retornaria um número, e usar isso como um iterador para range
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top