Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

3.4.3. Пример работы со списком с использованием итераторов (пример 3.4)

Рассмотрим пример работы со списком с использванием итераторов.

/////////////////////////////////////////////////////////////////////////////

// Прикладное программирование

// Пример 3.4. Пример работы с контейнером list

//

// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru

// СПб НИУ ИТМО

/////////////////////////////////////////////////////////////////////////////

#include <iostream> // подключение библиотеки ввода-вывода

#include <list> // подключение описания списка

#include <fstream> // для работы с файлами

using namespace std; // подключение стандартного пространства имен для использования библиотек

// прототипы функций

void read_from_file(list<int>& data, const string& filename);

/////////////////////////////////////////////////////////////////////////////

// Функция чтения конейнера list из файла

// data - контейнер для заполнения

// filename - имя файла

void read_from_file(list<int>& data, const string& filename)

{

ifstream ifile(filename); // создание потока ввода из файла по его имени

data.clear(); // очистить контейнер

int value;

// цикл будет выполняться до тех пор, пока не встретиться конец файла

while(!ifile.eof())

{

ifile>>value; // читаем число из файла

data.push_back(value); // записываем прочитанное число в конец контейнера

}

}

///////////////////////////////////////////////////////////////////////////////

void main()

{

list<int> x; // объявление контейнера

list<int>::iterator it; // объявление итератора

// пример работы с контейнером

x.push_back(0); // вставка в конец

x.push_back(1); // вставка в конец

x.push_back(2); // вставка в конец

// x = 0 1 2

x.push_front(5); // вставка в начало

// x = 5 0 1 2

it=x.begin();

it++;

x.insert(it, 3); // вставка перед итератором it

// x = 5 3 0 1 2

// вывод всех элементов контейнера

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

{

cout<<*it<<" "; //доступ к элементам по итератору

}

cout<<endl<<endl;

// чтение элементов списка из файла

read_from_file(x, "list_data.txt");

// вывод всех элементов контейнера

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

{

cout<<*it<<" "; //доступ к элементам по итератору

}

cout<<endl<<endl;

// вычисление суммы всех значений контейнера

int sum=0;

it=x.begin();

while(it!=x.end())

{

sum+=*it;

it++;

}

cout<<"sum="<<sum<<endl;

}

///////////////////////////////////////////////////////////////////////////////

3.5. Очереди и стек

3.5.1. Двусторонняя очередь deque (пример 3.5)

Двусторонняя очередь deque - очень похожа на vector: так же как и vector, она является последовательностью, которая поддерживает произвольный доступ к элементам. Главное что отличает deque от vector - это то, что deque также поддерживает вставку и удаление в начало последовательности за постоянное время. Кроме того, deque не имеет функций-членов аналогичных функциям-членам vector capacity() и reserve(), и не предоставляет никаких гарантий на допустимость итератора, который ассоциирован с его функциями-членами.

Пример работы с двусторонней очередью:

/////////////////////////////////////////////////////////////////////////////

// Прикладное программирование

// Пример 3.5. Пример работы с контейнером deque

//

// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru

// СПб НИУ ИТМО

/////////////////////////////////////////////////////////////////////////////

#include <iostream> // подключение библиотеки ввода-вывода

#include <deque> // подключение описания deque

#include <iterator> // подключение описания итераторов, нужно для использования ostream_iterator

using namespace std; // подключение стандартного пространства имен для использования библиотек

/////////////////////////////////////////////////////////////////////////////

void main()

{

deque<int> Q; // объявление контейнера

// вставка в конец, Q = 3

Q.push_back(3);

// вставка в начало, Q = 1 3

Q.push_front(1);

// вставка перед 1-м элементом, Q = 1 2 3

Q.insert(Q.begin() + 1, 2);

// изменение второго элемента, Q = 1 2 0

Q[2] = 0;

// вывод всех элементов контейнера при помощи алгоритма copy

copy(Q.begin(), Q.end(), ostream_iterator<int>(cout, " "));

}

///////////////////////////////////////////////////////////////////////////////

Существуют адаптеры очереди (cтек stack и очередь queue), которые имеют методы с одинаковыми именами, но они имеют разное смысловое значение.