Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 46 47 48 [ 49 ] 50 51 52 ... 78


L.push front(111); L.push back(999); МОЖНО написать

*front inserter(L)=lll; *back inserter(L)=999; Обратные итераторы

Как мы видели в разделе 3.1, для типа vector<int> определены следующие типы итераторов, и легко догадаться, что подобные итераторы имеются и для других типов, например list<double>:

vector<int>::iterator vector<int>::reverse iterator vector<int>::const iterator vector<int>::const reverse iterator

В разделе 1.2 обратный итератор использовался в следующем фрагменте для вывода всех элементов вектора v в обратном порядке:

vector<int>::reverse iterator i; for (i=v.rbegin; i != v.rendO; + + i) cout * i ;

Типы итераторов, имена которых начинаются с const, нужны, когда контейнер сам имеет атрибут const, как в следующей программе, где функция showlist является вариантом функции с тем же именем из раздела 1.3:

c iter.cpp: const iterator и

const reverse iterator

iinclude <iostream>

iinclude <list>

using namespace std;

void showlist(const list<int> &x) { Вперед:

list<int>::const iterator i;

for (i=x.begin(); i != x.endO; + + i) cout *i ;

cout endl; Вывод: 10 20 30

Назад:

list<int>::const reverse iterator j; for (j=x.rbegin(); j !=x.rend(); ++j)

cout *j ; cout endl; Вывод: 30 20 10

int mainO

{ list<int> L;

L.push back(10); L.push back(20); L.push back(30);



showlist(L); return 0;

Чтобы удалить префикс const , встречающийся два раза в функции showlist, мы должны также удалить ключевое слово const, имеющееся в первой строке этой функции. Поскольку функция не модифицирует список, передаваемый ей в качестве параметра, хороший стиль программирования требует наличия const в этом примере.

Потоковые итераторы

Мы использовали потоковые итераторы в разделе 1.9 и в других местах совместно с алгоритмом сору. Существует возможность работать с этими итераторами более элементарным способом; кроме того, вторым аргументом конструктора класса ostream iterator не обязана быть строка, состоящая лишь из пробелов, что демонстрирует следующая программа:

outiter.cpp: Потоковый итератор вывода; запись в файл с помощью операции присваивания,

iinclude <iostream> iinclude <vector> iinclude <iterator> using namespace std;

int mainO {

ostream iterator<int> i(cout, abc\n ); *i++ = 123; *i++ = 456; cout endl; return 0;

Эта программа выведет:

123abc 456abc

Поскольку здесь из всей STL мы используем только шаблон ostream iterator, программа будет работать, если напишем Uinclude <iterator> вместо Mnclude <vector>.

С вводом дела обстоят несколько сложнее, потому что требуется обнаружить конец входного потока. Вспомним обсуждение конца файла в разделе 1.9. Ниже приведено нетривиальное решение задачи, которая заключается в том, чтобы прочитать все числа из файла num.txt, содержащего только целые числа в обычном формате.



initer.cpp: Потоковый итератор ввода; чтение файла

с помощью операторов присваивания.

iinclude <iostream>

iinclude <fstream>

iinclude <vector>

iinclude <iterator>

using namespace std;

int mainO

{ ifstream file( num.txt ); if (file)

{ istream iterator<int> i(file), eof; int x;

while (i != eof) { X = *i++;

cout << X ;

} else cout << Cannot open file num.txt. ; cout << endl; return 0;

Например, если файл num.txt содержит две строчки

10 20 30

программа выведет на экран:

10 20 30



1 ... 46 47 48 [ 49 ] 50 51 52 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика