iterators intervalo numérico no impulso?
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?
Solução
#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 pararange