Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lutsik_Yu_A_Obektno_orientir_programmir_na_yaz.pdf
Скачиваний:
64
Добавлен:
11.05.2015
Размер:
4.33 Mб
Скачать

используется компонента-функция splice класса list, выполняющая удаление элементов списка ll с одновременным переносом их в список ls до позиции ите- ратора ls.end() – первый аргумент функции. В классе list имеются две другие версии этой функции:

void splice(iterator it, list& x, iterator first);

void splice(iterator it, list& x, iterator first, iterator last);

Функция с тремя аргументами позволяет удалить один элемент из кон- тейнера, определенного в качестве второго элемента, начиная с позиции, опре- деленной третьим аргументом. В функции с четырьмя элементами последние два параметра определяют диапазон удаляемых из контейнера (второй пара- метр) значений. Как и первая функция, два других удаляемых значения поме-

щают в позицию, отмеченную итератором (первый аргумент).

 

Р

Выполнение инструкции

 

У

ls.sort();

 

 

Г

 

вызывает функцию sort() класса list, производящую упорядочиваниеИэлементов

list по возрастанию.

 

 

 

После сортировки списков ls и ll выполняется функция

 

 

ls.merge(ll);

 

 

 

ах

 

 

удаляющая все объекты контейнера ll и вставки их в отсортированном виде в

контейнер ls (оба списка должны быть отсортиров ныБв одном порядке).

к

 

 

 

Далее следуют функции pop_front – уд ления элемента из начала после-

довательности и доступная во всех конт йнер

последовательности функция

pop_back – удаление из конца последоват льности.

В строке

 

 

е

ls.unique();

 

 

используется функция класса list, выполняющая удаление элементов-

дубликатов. При этом с

с к д лжен бы ь отсортирован.

 

пи

 

Использование далее функциит

ls.swap(ll);

 

о

 

доступной во всех контейнерах, приводит к обмену содержимым контейнеров ls

и ll.

 

б

 

и

 

В строке программыл

 

ls.assign(ll.begin(),ll.end());

 

Б

 

использована функция для замены содержимого объекта ls содержимым объек- та ll в диапазоне, определяемом двумя аргументами-итераторами.

Строка

ls.remove(2);

содержит вызов функции remove, удаляющей из ls все копии значения 2. И, наконец, в строке

ls.erase(itr,ls.end());

вызывается функция класса list, удаляющая из ls элементы с itr до ls.end.

9.5.3. Контейнер последовательностей deque

208

Класс deque объединяет многие возможности классов vector и list. Этот класс представляет собой двунаправленную очередь. В классе deque реализован механизм эффективного индексного доступа (подобно тому, как и в классе vector).

Класс deque реализован для эффективных операций вставки в начало и конец. Класс deque обеспечивает поддержку итераторов прямого доступа, что дает возможность использовать при работе с ним любых алгоритмов STL.

Класс deque имеет базовые функции, аналогичные классу vector, при этом

в класс deque добавлены компоненты-функции push_front и pop_front.

#include <iostream>

 

 

 

 

 

 

 

Р

using namespace std;

 

 

 

 

 

 

И

#include <deque>

 

 

 

 

 

 

 

У

 

#include <algorithm>

 

 

 

 

 

 

 

 

 

 

 

 

template<class T>

 

 

 

 

 

 

Г

 

 

void PrintDeque(const std::deque<T> &dq);

 

 

#define SIZE 6

 

 

 

 

 

 

 

 

int main()

 

 

 

 

 

а

 

 

{ std::deque<float>

d,dd(3,1.5);

 

Б

 

 

 

PrintDeque(dd);

 

 

 

к

 

 

 

d.push_back(2); d.push_front(5);

 

 

 

 

 

d.push_back(7);

 

 

d.push

front(9);

 

 

 

 

 

d[4]=3;

 

 

 

// из

нить значение 5-го элемента на 3

d.at(3)=6;

 

т

 

 

 

 

 

 

 

try { d.at(5)=0;

 

 

ме

 

 

 

 

 

 

}

 

о

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

catch(std::out of

 

range e) {

 

 

 

 

 

 

 

и

 

 

 

 

 

 

 

 

 

 

 

cout<<"Исключение : "<<e.what();

 

 

 

 

 

PrintDeque(d);

 

 

 

 

 

 

 

 

 

 

б

 

 

 

 

 

 

 

 

 

 

 

d.erase(d.begin() + 2); // удаление 3-го элемента

 

 

PrintDeque(d);л

 

 

 

 

 

 

 

 

 

 

d.insert(d.begin() + 3,7);// добавление 7 после 3-го элемента вектора

PrintDeque(d);

 

 

 

 

 

 

 

 

 

 

иd.insert(d.end()-1,2,1.6);

 

 

 

 

 

 

 

PrintDeque(d);

 

 

 

 

 

 

 

 

 

 

Б d.insert(d.end(),dd.begin(),dd.end());

 

 

 

 

 

PrintDeque(d);

 

 

 

 

 

 

 

 

 

 

std::sort(d.begin(),d.end());

 

 

 

 

 

 

PrintDeque(d);

 

 

 

 

 

 

 

 

 

 

d.swap(dd);

 

 

// замена массивов v и vv

 

 

PrintDeque(d);

 

 

 

 

 

 

 

 

 

 

PrintDeque(dd);

209

dd.erase(dd.begin(),dd.end()); //удаление всех элементов dd PrintDeque(dd);

d.clear(); // чистка всего вектора

PrintDeque(d); return 0;

}

template<class T>

void PrintDeque(const std::deque<T> &dq)

{ std::deque<T>::const_iterator pt;

 

 

 

Р

if (dq.empty())

 

 

 

 

 

 

{ cout << "Deque is empty " << endl;

 

 

 

return;

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

У

cout<<"DEQUE :"

 

 

 

Г

И

<<"

размер = "<<dq.size()<<endl;

 

cout<<"

содержимое = ";

 

Б

 

 

}

 

 

 

 

 

 

 

 

for(pt=dq.begin();pt!=dq.end();pt++)

 

 

 

 

cout<<*pt<<' ';

 

 

 

=1.5а1.5 1.5

 

 

cout<<endl;

 

 

 

 

 

Результат работы программы:

 

 

DEQUE : размер =

3

содержим

 

 

Исключение : invalid

deque<T> subscriptк

 

 

 

DEQUE : размер =

4

т

=9 5 2 6

 

 

содержим

 

 

DEQUE : размер =

3

содержимое=9 5 6

 

 

 

DEQUE : размер =

9одержимоес

=1.5 1.5 1.5 1.6 1.6 5 6 7 9

DEQUE : размер =

4

с держимое =9 5 6 7

 

 

 

 

 

и

с держимое =9 5 6 1.6 1.6 7

 

DEQUE : размер =

6

 

DEQUE : размер =

9

с держимое =9 5 6 1.6 1.6 7 1.5 1.5 1.5

 

 

л

 

 

 

 

 

 

 

б

 

3

содержимое =1.5 1.5 1.5

 

 

DEQUE : размер =

 

 

DEQUE : размер =

9

содержимое =1.5 1.5 1.5 1.6 1.6 5 6 7 9

Deque is empty

 

 

 

 

 

 

 

Deque is empty

 

 

 

 

 

 

 

Б

 

 

 

 

 

 

 

 

 

В приведенноми примере использованы все ранее рассмотренные функции классов vector list, также являющиеся компонентами класса deque. В програм- ме были использованы все три версии функции insert:

iterator insert(iterator it, const T& x = T()); void insert(iterator it, size_type n, const T& x);

void insert(iterator it, const_iterator first, const_iterator last);

Первая версия функции предназначена для вставки после элемента, на ко- торый указывает итератор, значения, соответствующего второму параметру. Вторая версия вставляет n значений, равных третьему параметру. Наконец, тре-

210

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]