Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 14

cout<<v[i]<<" ";

}

// Поиск и вывод минимального элемента

pos = min_element (v.begin(),v.end());

cout << "\nmin: " << *pos << endl;

// Сортировка всех элементов по возрастающей

sort (v.begin(), v.end());

cout << "Отсортированные элементы:\n";

for (pos = v.begin(); pos != v.end(); ++pos) cout << *pos << ' ';

cout<<"\n Вектор без дубликатов "<<endl;

//Убрать дубликаты

v.erase(unique(v.begin(), v.end()),v.end());

for(int i=0;i<v.size();i++)

   cout<<v[i]<<" ";

}

Результат

Исходный вектор

6  1  6  5  3  2  5  0  5  6

min: 0

Отсортированные элементы:

0  1  2  3  5  5  5  6  6  6

Вектор без дубликатов

0  1  2  3  5

Пример 10

…………

int rnd(void)

{return rand()%6;}

void main()

{   int N=20;

vector<int >v(N);

vector<int >::iterator it;

generate(v.begin(),v.end(), rnd) ;

for(it = v.begin(); it != v.end(); it++)

    cout << *it << " " ;

}

Результат

5 5 4 4 5 4 0 0 4 2 5 5 1 3 1 5 1 2 3 0

Пример 11

К коду примера 10 добавим директивы

#include <functional >

#include <numeric>

и операторы

it=v.begin();

cout<<”Cумма равна: ”<<accumulate(it+2,it+6,0);

cout<<"\n Произведение равно: "

<<accumulate(it+2,it+6,1,multiplies<int>());

Результат

Сумма равна: 17.

Произведение равно: 320.

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

Потоковые итераторы позволяют интепретировать устройства ввода/вывода (потоки cin/cout), как итераторы. А это значит, что можно использовать устройства ввода/вывода в качестве параметров алгоритмов STL!

Основное предназначение входных и выходных итераторов – как раз поддержка потоковых итераторов. С их помощью можно приме-нять соотвествующие алгоритмы напрямую к потокам ввода/вывода.

Потоковые итераторы – это объекты шаблонных классов разных типов ввода/вывода. Существует два потоковых итератора: ostream_ iterator и istream_iterator. Наибольшее применение нашел первый из них, ему и уделим мы свое внимание.

Объект класса ostream_iteratorможет использоваться в качестве параметра любого алгоритма, с выходным итератором. В примере 12 он используется как параметр метода copy.

Пример 12

int arr[] = {10,20,30,40};

vector<int>v(arr,arr+4);//Переносим массив в вектор

ostream_iterator<int>it(cout,", ");// Создаем объект it класса

// ostream_iterator

cout<<"Содержимое вектора"<<endl;

copy(v.begin(),v.end(),it);// Вывод вектора

Результат

Содержимое вектора

10, 20, 30, 40,

Анализ

Мы определили итератор it как объект класса ostream_iteratorдля чтения значений типа int. Конструктор этого объекта имеет два параметра. Первым является поток, в который бдут записываться значения (в данном случае это cout). Вторым – С-строка, которая будет выводиться после каждого значения. Здесь мы используем запятую и пробел.

Алгоритм copy копирует содержимое вектора в поток cout (в поток вывода на экран).

Если мы хотим содержимое вектора записать в файл, то вместо сout надо использовть выходной файловый поток класса ostream (работа № 4).

Порядок выполнения работы

1.  Составить шаблон функции печати сформированного вами век-тора для любых типов его элементов. Размеры вектора в функцию не передавать!

2.  Реализовать требуемый алгоритм задания методами контейнера vector и алгоритмами STL.

3.  Если это не противоречит условию задачи, то заполнение век-тора производить с помощью функций rand иgenerate.

Варианты заданий

Вариант 1

Сформировать и напечатать произвольную квадратную матрицу с целыми элементами, вводя с клавиатуры ее размер N. Определить сумму и произведение элементов каждой строки, исключая первый и последний элемент.

Вариант 2

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