- •Содержание
- •ВВЕДЕНИЕ
- •1.ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД
- •2. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
- •2.1. Абстрактные типы данных
- •2.2. Базовые принципы объектно-ориентированного программирования
- •2.3. Основные достоинства языка С++
- •2.4. Особенности языка С++
- •2.4.1. Ключевые слова
- •2.4.2. Константы и переменные
- •2.4.3. Операции
- •2.4.4. Типы данных
- •2.4.5. Передача аргументов функции по умолчанию
- •2.5.1. Объект cin
- •2.5.2. Объект cout
- •2.5.3. Манипуляторы
- •3.1. Объекты
- •3.2. Понятие класса
- •3.3. Конструктор копирования
- •3.4. Конструктор explicit
- •3.5. Указатель this
- •3.6. Встроенные функции (спецификатор inline)
- •3.7. Организация внешнего доступа к локальным компонентам класса (спецификатор friend)
- •3.8. Вложенные классы
- •3.9. Static-члены (данные) класса
- •3.10. Компоненты-функции static и const
- •3.11. Proxi-классы
- •3.12. Ссылки
- •3.12.1. Параметры ссылки
- •3.12.2. Независимые ссылки
- •3.13. Пространства имен
- •3.13.3. Ключевое слово using как объявление
- •3.13.4. Псевдоним пространства имен
- •3.14. Практические приемы ограничения числа объектов класса
- •4. НАСЛЕДОВАНИЕ
- •4.1.1. Конструкторы и деструкторы при наследовании
- •4.2. Виртуальные функции
- •4.3. Абстрактные классы
- •4.4. Виртуальные деструкторы
- •4.6. Виртуальное наследование
- •5.2. Перегрузка операторов
- •5.2.2. Перегрузка унарного оператора
- •5.2.3. Дружественная функция operator
- •5.2.4. Особенности перегрузки операции =
- •5.2.5. Перегрузка оператора []
- •5.2.6. Перегрузка оператора ()
- •5.2.7. Перегрузка оператора ->
- •5.2.8. Перегрузка операторов new и delete
- •5.3. Преобразование типа
- •5.3.1. Явные преобразования типов
- •6. ШАБЛОНЫ
- •6.1. Параметризированные классы
- •6.2. Передача в шаблон класса дополнительных параметров
- •6.3. Шаблоны функций
- •6.4. Совместное использование шаблонов и наследования
- •6.5. Шаблоны класса и friend-функции
- •6.6. Некоторые примеры использования шаблона класса
- •6.6.1. Реализация smart-указателя
- •6.6.2. Задание значений параметров класса по умолчанию
- •7.2. Состояние потока
- •7.3. Строковые потоки
- •7.4. Организация работы с файлами
- •7.5. Организация файла последовательного доступа
- •7.6. Создание файла произвольного доступа
- •7.7. Основные функции классов ios, istream, ostream
- •8. ИСКЛЮЧЕНИЯ В С++
- •8.2. Перенаправление исключительных ситуаций
- •8.3. Исключительная ситуация, генерируемая оператором new
- •8.6. Спецификации исключительных ситуаций
- •8.7. Задание собственного неожиданного обработчика
- •9. СТАНДАРТНАЯ БИБЛИОТЕКА ШАБЛОНОВ (STL)
- •9.3. Категории итераторов
- •9.4. Операции с итераторами
- •9.5. Контейнеры последовательностей
- •9.5.2. Контейнер последовательностей list
- •9.5.3. Контейнер последовательностей deque
- •9.6. Ассоциативные контейнеры
- •9.6.1. Ассоциативный контейнер multiset
- •9.6.2. Ассоциативный контейнер set
- •9.6.3. Ассоциативный контейнер multimap
- •9.7.1. Адаптер stack
- •9.7.2. Адаптер queue
- •9.7.3. Адаптер priority_queue
- •9.8. Алгоритмы
- •9.8.1. Алгоритмы сортировки sort, partial_sort, sort_heap
- •9.8.2. Алгоритмы поиска find, find_if, find_end, binary_search
- •9.8.3. Алгоритмы fill, fill_n, generate и generate_n
- •9.8.4. Алгоритмы equal, mismatch и lexicographical_compare
- •9.8.6. Алгоритмы работы с множествами
- •9.8.7. Алгоритмы swap, iter_swap и swap_ranges
- •9.8.8. Алгоритмы copy, copy_backward, merge, unique и reverse
- •10. ПРИМЕРЫ РЕАЛИЗАЦИИ КОНТЕЙНЕРНЫХ КЛАССОВ
- •10.1. Связанные списки
- •10.1.1. Реализация односвязного списка
- •10.2. Реализация бинарного дерева
- •11. ПРОГРАММИРОВАНИЕ ДЛЯ WINDOWS
- •11.1. Система, управляемая сообщениями
- •11.2. Управление графическим выводом
- •11.3. Контекст устройства
- •11.3.1. Экран
- •11.3.2. Принтер
- •11.3.3. Объект в памяти
- •11.3.4. Информационный контекст
- •11.4. Архитектура, управляемая событиями
- •11.5. Исходный текст программы
- •11.7. Некоторые новые типы данных
- •11.8. Венгерская нотация
- •11.9. Точка входа программы
- •11.11. Создание окна
- •11.12. Цикл обработки сообщений
- •11.13. Оконная процедура
- •11.14. Обработка сообщений
- •11.15. Обработка сообщений функцией DefWindowProc
- •11.16. Синхронные и асинхронные сообщения
- •11.17. Еще один метод получения описателя контекста устройства
- •11.19. Полосы прокрутки
- •Литература
используется компонента-функция 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