De vez en cuando siento la necesidad de cierto tipo de iterador (para el cual no puedo inventar un buen nombre, excepto el que está prefijado al título de esta pregunta).¿iterador de secuencia? ¿No hay uno en el impulso?
Supongamos que tenemos una función (u objeto de función) que asigna un entero al tipo T. Es decir, tenemos una definición de secuencia matemática, pero en realidad no la tenemos almacenada en la memoria. Quiero hacer un iterador fuera de esto. La clase de iterador sería algo como esto:
template <class F, class T>
class sequence_iterator : public std::iterator<...>
{
int i;
F f;
public:
sequence_iterator (F f, int i = 0):f(f), i(i){}
//operators ==, ++, +, -, etc. will compare, increment, etc. the value of i.
T operator*() const
{
return f(i);
}
};
template <class T, class F>
sequence_iterator<F, T> make_sequence_iterator(F f, int i)
{
return sequence_iterator<F, T>(f, i);
}
Tal vez estoy siendo ingenuo, pero yo personalmente creo que este iterador sería muy útil. Por ejemplo, supongamos que tengo una función que verifica si un número es primo o no. Y quiero contar el número de primos en el intervalo [a, b]. Yo haría esto;
int identity(int i)
{
return i;
}
count_if(make_sequence_iterator<int>(identity, a), make_sequence_iterator<int>(identity, b), isPrime);
Desde que he descubierto algo que sería útil (al menos en mi humilde opinión) Definitivamente soy positivo que existe en aumento o la biblioteca estándar. Simplemente no puedo encontrarlo. Entonces, ¿hay algo como esto en boost?. En el muy poco probable caso de que realmente no exista, entonces voy a escribir uno, y en este caso me gustaría saber su opinión sobre si debo o no hacer el iterator_category
random_access_iterator_tag
. Mi preocupación es que este no es un RAI real, porque operator*
no devuelve una referencia.
Gracias de antemano por cualquier ayuda.
CUDA Thrust tiene exactamente ese tipo de cosas para evitar tener que hacer secuencias explícitas "triviales". –
Esto me recordó a la [Secuencia de Fibonacci] de Matthew Wilson (http://www.informit.com/content/images/9780321305503/samplechapter/0321305507_CH23.pdf). Es más como un caso específico de lo que estás hablando, pero al menos podría darte algunas ideas o inspiración :-) – mrm
mrm: exactamente, quiero una generalización de eso :) –