|
Программирование >> Немодифицирующие последовательные алгоритмы
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |