» Главная
eXcode.ru » Статьи » С / С++
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 10





Итераторы потоков библиотеки STL




     Чтобы шаблоны алгоритмов могли работать непосредственно с потоками ввода-вывода, предусмотрены соответствующие шаблонные классы, подобные итераторам. Например,

partial_sum_copy(istream_iterator<double>(cin), istream_iterator<double>(),
		 ostream_iterator<double>(cout, "
"));

читает файл, содержащий числа с плавающей запятой, из cin и печатает частичные суммы в cout.

Итератор входного потока (Istream Iterator)

     istream_iterator<T> читает (используя operator>>) последовательные элементы из входного потока, для которого он был создан. После своего создания итератор каждый раз при использовании ++ читает и сохраняет значение T. Если достигнут конец потока (operator void* () в потоке возвращает false), итератор становится равным значению end-of-stream (конец-потока). Конструктор без параметров istream_iterator() всегда создаёт итераторный объект конца потокового ввода, являющийся единственым законным итератором, который следует использовать для конечного условия. Результат operator* для конца потока не определён, а для любого другого значения итератора возвращается const T&.

     Невозможно записывать что-либо с использованием входных итераторов. Основная особенность входных итераторов - тот факт, что операторы ++ не сохраняют равенства, то есть i == j не гарантирует вообще, что ++ i == ++ j. Каждый раз, когда ++ используется, читается новое значение. Практическое следствие этого факта - то, что входные итераторы могут использоваться только для однопроходных алгоритмов, что действительно имеет здравый смысл, так как многопроходным алгоритмам всегда более соответствует использование структур данных в оперативной памяти.

     Два итератора конец-потока всегда равны. Итератор конец-потока не равен не-конец-потока итератору. Два не-конец-потока итератора равны, когда они созданы из того же самого потока.

template <class T, class Distance = ptrdiff_t>
class istream_iterator : public input_iterator<T, Distance> {
friend bool operator==(const istream_iterator<T, Distance>& x,
		 	const istream_iterator<T, Distance>& y);
public:
	istream_iterator();
	istream_iterator(istream& s);
	istream_iterator(const istream_iterator<T, Distance>& x);
	~istream_iterator();
	const T& operator*() const;
	istream_iterator<T, Distance>& operator++();
	istream_iterator<T, Distance> operator++(int);
};

template <class T, class Distance>
bool operator==(const istream_iterator<T, Distance>& x,
		 const istream_iterator<T, Distance>& y);

Итератор выходного потока (Ostream Iterator)

     istream_iterator<T> записывает (используя operator<<) последовательные элементы в выходной поток, из которого он был создан. Если он был создан с параметром конструктора char*, эта строка, называемая строкой разделителя (delimiter string), записывается в поток после того, как записывается каждое T. Невозможно с помощью выходного итератора получить значение. Его единственное использование - выходной итератор в ситуациях, подобных нижеследующему:

	while (first != last) *result++ = *first++;

     ostream_iterator определён как:

template <class T>
class ostream_iterator : public output_iterator {
public:
	ostream_iterator(ostream& s);
	ostream_iterator(ostream& s, const char* delimiter);
	ostream_iterator(const ostream_iterator<T>& x);
	~ostream_iterator();
	ostream_iterator<T>& operator=(const T& value);
	ostream_iterator<T>& operator*();
	ostream_iterator<T>& operator++();
	ostream_iterator<T>& operator++(int);
};
К началу статьи





Добавил: LedWormДата публикации: 2006-03-14 10:08:07
Рейтинг статьи:3.00 [Голосов 5]Кол-во просмотров: 9232

Комментарии читателей

Всего комментариев: 1

2007-12-07 08:49:25
Тупая скотина
Бляяяяяяяяя
Ничего не понял!!!!!!!!
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Какой вид спорта вы предпочитаете?
Футбол
28% (61)
Баскетбол
9% (20)
Волейбол
8% (18)
Теннис
5% (10)
Легкая атлетика
2% (5)
Хоккей
5% (11)
Лыжный спорт
3% (6)
Всеми
3% (7)
Другим
18% (38)
Я не дружу со спортом!
19% (41)

Проголосовало: 217
Встречаются двое юзеров. Один говорит:
- Я тут свежий антивирус достал, не хочешь себе установить?
- Нет, мне это не нужно.
- Почему?
- Да мой комп так глючит, что на нем ни один вирус не запустится.
Рейтинг: 5.1/10 (7)
Посмотреть все анекдоты