Время от времени я испытываю потребность в определенном типе итератора (для которого я не могу придумать хорошее имя, кроме префикса к названию этого вопроса).
Предположим, у нас есть функция (или функциональный объект), которая отображает целое число на тип 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);
Поскольку я обнаружил что-то, что было бы полезно (по крайней мере, ИМХО), я определенно уверен, что это существует в boost или стандартной библиотеке.Я просто не могу найти это.Итак, есть что-нибудь подобное в boost? .В очень маловероятном случае, которого на самом деле нет, тогда я напишу один - и в этом случае я хотел бы узнать ваше мнение, должен ли я сделать iterator_category
random_access_iterator_tag
.Меня беспокоит, что это не настоящий RAI, потому что operator*
не возвращает ссылку.
Заранее благодарен за любую помощь.