Время от времени я чувствую потребность в определенном виде итератора (для которого я не могу составить хорошее имя, кроме того, что префикс к названию этого вопроса).
Предположим, что у нас есть функция (или объект функции), которая отображает целое число типа T. То есть мы имеем определение математической последовательности, но на самом деле мы ее не храним в памяти. Я хочу сделать из него итератор. Класс итератора будет выглядеть примерно так:
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);
}
Возможно, я наивна, но лично я чувствую, что этот итератор будет очень полезным. Например, предположим, что у меня есть функция, которая проверяет, является ли число простым или нет. И я хочу подсчитать количество простых чисел в интервале [a, b]. Я бы это сделал,
int identity(int i)
{
return i;
}
count_if(make_sequence_iterator<int>(identity, a), make_sequence_iterator<int>(identity, b), isPrime);
Так как я обнаружил что-то полезное (по крайней мере, IMHO), я определенно уверен, что он существует в boost или стандартной библиотеке. Я просто не могу его найти. Итак, есть что-то подобное в boost?. В очень маловероятном случае, что на самом деле нет, тогда я напишу один - и в этом случае я хотел бы узнать ваше мнение, следует ли мне сделать iterator_category
random_access_iterator_tag
. Меня беспокоит, что это не настоящий RAI, потому что operator*
не возвращает ссылку.
Заранее благодарим за помощь.