- •Содержание
- •1. Пары
- •2. Контейнеры stl
- •3. Алгоритмы stl
- •4. Адаптеры контейнеров
- •5. Ассоциативные контейнеры
- •5.1. Множества и мультимножества
- •5.2 Отображения и мультиотображения
- •6. Строки
- •7. Потоки ввода-вывода
- •8. Итераторы
- •9. Управление памятью. Класс auto_ptr
- •Список использованных источников
7. Потоки ввода-вывода
В C++ операции ввода-вывода выполняются при помощи потоков данных. Согласно принципам объектно-ориентированного программирования, поток данных представляет собой объект, свойства которого определяется классом. Вывод интерпретируется как запись данных в поток, а ввод — как чтение данных из потока. Для стандартных каналов ввода-вывода существуют стандартные глобальные объекты. [1]
Ниже приведён листинг программы, демонстрирующий использование потоков ввода-вывода.
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
/*функция, считывающая целые числа из потока ввода и копирующая их в вектор*/
void readVector(vector<int> &v, istream &in) {
v.clear();
int a;
while (in>>a){
v.push_back (a);
}
}
/*функция, записывающая целые числа из вектора в поток вывода*/
void printVector(vector<int> &v, ostream &out) {
for (vector<int>::iterator iter=v.begin(); iter != v.end(); ++iter){
out<<*iter << " ";
}
out << endl;
}
int main ()
{
vector<int> vec;
/*заполнение вектора, в качестве аргумента передаётся cin*/
cout<<"enter vector: ";
readVector(vec, cin);
/*вывод элементов вектора в поток cout*/
printVector(vec, cout);
/*заполнение вектора, в качестве аргумента передаётся файловый
поток fin*/
ifstream fin("input_task2.txt");
readVector(vec, fin);
fin.close();
/*вывод элементов вектора в файловый поток fout*/
ofstream fout("output.txt");
printVector(vec, fout);
fout.close();
/*передача строки в строковый поток ввода*/
istringstream sstr_in("23 56 56 45 64 23 34");
readVector(vec, sstr_in);
/*вывод элементов вектора в строковый поток и вывод строки в поток
cout*/
ostringstream sstr_out;
printVector(vec, sstr_out);
cout << "string: " << sstr_out.str();
if (true) return 0;
}
Содержимое входного файла:
1990 2000 2010 2020 2030 2040 2050
Содержимое файла output.txt:
1990 2000 2010 2020 2030 2040 2050
Результат работы программы:
enter vector: 1 2 3^D
1 2 3
string: 23 56 56 45 64 23 34
8. Итераторы
Итераторы призваны предоставлять доступ к членам контейнеров, они могут быть использованы способом, похожим на манипуляции указателями. Например, можно использовать итератор для прохода по всем элементам вектора. Есть несколько разных типов итераторов:
input_iterator (для чтения). Читают значения с движением вперед. Могут быть инкрементированы, сравнены и разыменованы.
output_iterator (для записи). Пишут значения с движением вперед. Могут быть инкрементированы и разыменованы.
forward_iterator (однонаправленные). Читают или пишут значения с движением вперед. Комбинируют функциональность предыдущих двух типов с возможностью сохранять значение итератора.
bidirectional_iterator (двунаправленные). Читают и пишут значения с движением вперед или назад. Похожи на однонаправленные, но их также можно инкрементировать и декрементировать.
random_iterator (с произвольным доступом). Читают и пишут значения с произвольным доступом. Самые мощные итераторы, сочетающие функциональность двунаправленных итераторов и возможность выполнения арифметики указателей и сравнений указателей.
reverse_iterator (обратные). Или итераторы с произвольным доступом, или двунаправленные, движущиеся в обратном направлении.
Каждый класс контейнеров связан с типом итератора, и каждый из алгоритмов STL использует определенный тип итератора.
Например, векторы связаны с итераторами с произвольным доступом, значит, они могут использовать алгоритмы, требующие произвольного доступа. Так как итераторы с произвольным доступом включают в себя все свойства других итераторов, то векторы также могут использовать алгоритмы, написанные для других итераторов. [7]
Ниже представлен листинг программы, которая содержит алгоритмы, использующие разные типы итераторов.
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <fstream>
using namespace std;
int main ()
{
vector <int> vec;
ifstream in("input_task2.txt");
while (!in.eof()){
int x;
in>>x;
vec.push_back (x);
}
in.close();
/*copy() использует InputIterator и OutputIterator для считывания
из потока и зпаиси в поток*/
copy (istream_iterator<int>(cin), istream_iterator<int>(),
ostream_iterator <int>(cout, " "));
ofstream out("output.txt");
out<<"vector:\n";
for (vector <int>::iterator iter = vec.begin (); iter != vec.end();
++iter){
out<<*iter<<" ";
}
/*max_element использует input iterator*/
vector<int>::iterator max_it = max_element(vec.begin (),
vec.end());
out<<"\n\ninput iterator\nmax: "<<*max_it<<"\n\n";
/*generate_n использует output iterator*/
vector <int> vec_temp(vec);
generate_n(vec_temp.begin (), vec_temp.size(), rand);
out<<"output iterator\ngenerate rand():\n";
for (vector <int>::iterator iter = vec_temp.begin (); iter !=
vec_temp.end(); ++iter){
out<<*iter<<" ";
}
/*fill использует forward iterator*/
out<<"\n\nforward iterator:\nfill():\n";
fill (vec_temp.begin (), vec_temp.end(), 1);
for (vector <int>::iterator iter = vec_temp.begin (); iter !=
vec_temp.end(); ++iter){
out<<*iter<<" ";
}
/*reverse использует bidirectional iterator*/
out<<"\n\nbidirectional iterator:\n"<<"reverse():\n";
vector <int> vec_temp1(vec);
reverse (vec_temp1.begin(), vec_temp1.end());
for (vector <int>::iterator iter = vec_temp1.begin (); iter !=
vec_temp1.end(); ++iter){
out<<*iter<<" ";
}
/*random_shuffle использует random access iterator*/
out<<"\n\nrandom access iterator:\n";
random_shuffle (vec.begin(), vec.end ());
for (vector <int>::iterator iter = vec.begin (); iter != vec.end();
++iter){
out<<*iter<<" ";
}
out.close();
return 0;
}
Содержимое входного файла:
1990 2000 2010 2020 2030 2040 2050
Результат работы программы:
vector:
1990 2000 2010 2020 2030 2040 2050
input iterator
max: 2050
output iterator
generate rand():
41 18467 6334 26500 19169 15724 11478
forward iterator:
fill():
1 1 1 1 1 1 1
bidirectional iterator:
reverse():
2050 2040 2030 2020 2010 2000 1990
random access iterator:
2030 2010 1990 2000 2020 2040 2050