Категория input_iterator
Категория input_iterator - это одна из категорий итераторов в C++,
которая описывает итераторы, предназначенные для последовательного
одноразового чтения элементов из диапазона. Такой итератор позволяет
перемещаться только вперёд, по одному элементу за раз, и гарантирует,
что каждый элемент может быть прочитан ровно один раз. В отличие от
более сильных категорий, input_iterator не требует возможности
повторного прохода по диапазону и не позволяет изменять элементы через
итератор. Типичными примерами являются итераторы чтения из входного
потока, например istream_iterator.
Итератор категории input_iterator поддерживает операцию
разыменования * для чтения текущего элемента, операцию
инкремента ++ для перехода к следующему элементу, а также
сравнение на равенство и неравенство == и !=.
Копирование такого итератора допускается, но после инкремента одной
из копий все остальные копии могут стать недействительными.
Синтаксис
// Проверка, является ли тип итератором ввода
#include <iterator>
std::input_iterator<T>
// Концепт из C++20
template<class I>
concept input_iterator = /* ... */;
Пример
Давайте проверим с помощью концепта std::input_iterator,
является ли итератор вектора итератором ввода:
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
if (input_iterator<decltype(vec.begin())>) {
cout << "input_iterator" << endl;
} else {
cout << "not input_iterator" << endl;
}
return 0;
}
Результат выполнения кода:
"input_iterator"
Пример
Давайте прочитаем элементы из входного потока с помощью
istream_iterator, который является классическим примером
итератора ввода, и выведем их:
#include <iostream>
#include <iterator>
#include <sstream>
using namespace std;
int main()
{
istringstream stream("1 2 3 4 5");
istream_iterator<int> it(stream);
istream_iterator<int> end;
while (it != end) {
cout << *it << " ";
++it;
}
return 0;
}
Результат выполнения кода:
1 2 3 4 5
Пример
Давайте воспользуемся алгоритмом copy, который принимает
итераторы ввода, чтобы скопировать данные из потока в вектор:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <sstream>
using namespace std;
int main()
{
istringstream stream("1 2 3 4 5");
istream_iterator<int> it(stream);
istream_iterator<int> end;
vector<int> res;
copy(it, end, back_inserter(res));
for (int num : res) {
cout << num << " ";
}
return 0;
}
Результат выполнения кода:
1 2 3 4 5
Смотрите также
-
категория
forward_iterator,
которая позволяет многократный проход по диапазону -
категория
bidirectional_iterator,
которая позволяет двигаться в обоих направлениях -
категория
random_access_iterator,
которая поддерживает произвольный доступ к элементам -
функция
advance,
которая перемещает итератор на заданное число позиций