- •Материал к курсам «Объектно-ориентированное программирование», «Инструментальные средства визуального программирования» и «Современные технологии и инструментарий программирования»
- •8. Интерфейс графического устройства, цвет и шрифт 71
- •10. Консольные приложения Windows 91
- •21. Алгоритмы 220
- •22. Профилирование программы в Microsoft Visual Studio 6.0 238
- •23. Некоторые функции api Win32 240
- •24. Разное-всякое 247
- •Часть2.Технология сом 299
- •Предисловие автора
- •1.3.Работа со строками
- •1.3.1.Кодировки и кодовые страницы
- •1.3.2.О кодировке Unicode
- •1.3.3.Использование класса cString
- •1251 (Cyrillic (Windows) ) в кодировку 866 (Cyrillic dos).
- •1.3.4.Некоторые полезные функции класса cString
- •1.4.Явное преобразование типов
- •1.4.1.Преобразование полиморфных типов dynamic_cast
- •1.4.2.Преобразование неполиморфных типов static_cast
- •1.4.3.Преобразование reinterpret_cast
- •2.Соглашения об именах
- •3.Пространства имен
- •4.Макросы и отладка
- •4.1.Макрос trace
- •4.2.Объект afxDump
- •4.3.Классы cDumpContext и cObject
- •4.5.Макрос assert_valid
- •4.6.Макрос verify
- •4.7.Автоматическая диагностика неуничтоженных объектов
- •5.Каркас приложений mfc
- •5.1.Понятие каркаса приложений
- •Каркас приложений и библиотека классов
- •Пример на базе каркаса приложений
- •5.2.Сопоставление сообщений в библиотеке mfc
- •5.3.Документы и их представление
- •5.4.Функции взаимодействия «документ-вид»
- •5.5.Простейшее приложение на базе архитектуры «документ-вид»
- •5.6.Усложненное взаимодействие «документ-вид»
- •6.Класс «вид» библиотеки mfc (версия mvs 6.0)
- •6.1.Что такое «вид»
- •6.2.Интерфейсы sdi и mdi
- •6.3. Сценарий создания приложения drw в ис mvs 6.0
- •6.4.Класс cdrwView
- •6.5.Рисование внутри окна представления: Windows gdi
- •Функция-член OnDraw
- •Контекст устройства в Windows
- •Добавление кода рисования в программу drw
- •6.6.Первое знакомство с редакторами ресурсов
- •Содержимое файла drw.Rc
- •Работа с редактором диалоговых окон
- •6.7.Конфигурации Win32 Debug и Win32 Release
- •6.8.Активизация диагностических макросов
- •6.9.Предкомпилированные заголовочные файлы
- •6.10.Два способа запуска программы
- •7.Класс «вид» библиотеки mfc (версия mvs 2005)
- •7.1.Что такое «вид»
- •7.2.Интерфейсы sdi и mdi
- •7.3. Сценарий создания приложения с архитектурой документ-вид в среде mvs 2005
- •7.4.Класс cdrwView
- •7.5.Рисование внутри окна представления: Windows gdi
- •Функция-член OnDraw
- •Контекст устройства в Windows
- •Добавление кода рисования в программу drw
- •7.6.Конфигурации Win32 Debug и Win32 Release
- •7.7.Активизация диагностических макросов
- •7.8.Два способа запуска программы
- •8.Интерфейс графического устройства, цвет и шрифт
- •8.1.Классы контекста дисплея cClientDc и cWindowDc
- •8.2.Создание и уничтожение cdc-объектов
- •8.3.Состояние контекста устройства
- •8.4.Класс cPaintDc
- •8.5.Объекты gdi
- •8.6.Создание и уничтожение gdi-объектов
- •8.7.Управление gdi-объектами
- •8.8.Стандартные gdi-объекты
- •8.9.Время жизни контекста устройства
- •9.1.Приложение, основанное на диалоговом окне
- •9.2.Приложение без поддержки архитектуры документ-вид
- •9.3.Приложение с поддержкой архитектуры документ-вид
- •9.4.Краткая характеристика базовых классов класса вид
- •9.4.1.Класс cView
- •9.4.2.Класс cFormView
- •9.4.3.Класс cHtmlView
- •9.4.4.Класс cListView
- •9.4.5.Класс cRichEditView
- •9.4.6.Класс cScrollView
- •9.4.7.Класс cTreeView
- •10.2.Создание консоли
- •10.3.Закрытие консоли
- •10.4.Дескрипторы консоли
- •10.5.Входной буфер консоли
- •10.6.Буферы дисплея консоли
- •10.7.Размер буфера окна и дисплея
- •10.8.Скроллинг дисплейного буфера
- •10.9.Методы ввода/вывода в консольных приложениях
- •10.10.Режимы консоли
- •10.11.Высокоуровневый консольный ввод/вывод
- •10.12.Высокоуровневые режимы консоли
- •10.13.Высокоуровневые функции ввода и вывода консоли
- •10.15.Низкоуровневые режимы консоли
- •10.16.Низкоуровневые функции ввода консоли
- •10.14.Низкоуровневые функции ввода и вывода консоли
- •10.17.Низкоуровневые функции вывода консоли
- •10.18.Кодовые страницы в консольных приложениях
- •10.19.Пример консольного приложения ColorRusConsole
- •10.20.Использование графики в консольных приложениях
- •10.21.Изменение заголовка окна приложения и его прятание
- •11.Архитектура документ-вид и диалоговое окно
- •11.1.Как получить доступ к документу из диалогового окна
- •11.1.1.Первый способ
- •11.1.2.Второй способ
- •11.2.Как получить доступ к представлению из диалогового окна
- •11.3.Отображение данных в управляющих элементах диалогового окна и их получение (mvs 6.0)
- •11.4.Создание оконных подклассов для расширенного управления вводом данных
- •12.Обработка файлов
- •12.1.Обработка текстовых файлов (mvs 6.0)
- •12.2.Обработка текстовых файлов (mvs 2005)
- •12.3.Обработка двоичных файлов
- •12.4.Поиск файлов и каталогов по заданному пути и маске
- •12.5.Диалоги по выбору имени файла и каталога
- •13.Обработка сообщений Windows
- •13.1.Обработка сообщений в рамках одного приложения
- •13.2.Об обработке команд
- •13.3.Обработка сообщений в рамках системы
- •14.Разработка и использование собственных dll
- •14.1.Основы dll
- •14.1.1.Согласование импортируемых элементов с экспортируемыми
- •14.1.2.Явное и неявное связывание
- •14.1.3.Связывание по символьным именам против связывания по порядковым номерам
- •14.1.4.Точка входа в dll: функция DllMain
- •14.1.5.Описатели экземпляров и загрузка ресурсов
- •14.1.6.Порядок поиска dll клиентской программой
- •14.1.7.Отладка dll
- •14.1.9.Общие dll mfc-библиотеки
- •14.1.10.Dll-расширения: экспорт классов
- •14.1.11.Последовательность поиска ресурсов в dll-расширении
- •14.2.Разработка библиотеки
- •14.3.Разработка клиентского приложения, использующего библиотеку dll
- •15.Обработка растровых изображений
- •16.Обработка исключительных ситуаций
- •If (блок будет работать)
- •16.1.Введение в обработку исключительных ситуаций
- •16.2.Синтаксис обработки исключительных ситуаций
- •16.3.Синтаксис инициирования исключительных ситуаций
- •16.4.Примеры генерации и обработки исключительных ситуаций
- •17.Классы
- •17.1.Пример класса tVector
- •17.2.Класс tVector с перегруженными операциями
- •18.Шаблоны классов
- •18.1.Пример шаблона класса
- •18.2.Шаблон класса tVector
- •19.Стандартная библиотека, библиотеки mfc и atl
- •19.1.Состав стандартной библиотеки
- •19.2.Библиотеки mfc и atl
- •20.Коллекции
- •20.1.Обзор коллекций mfc
- •20.2.Шаблонные классы коллекций mfc
- •20.3.Использование массивов, списков и ассоциативных массивов
- •20.3.1.Использование простых массивов и списков
- •20.3.2.Члены класса cArray
- •Конструкторы
- •Атрибуты
- •Обработка
- •Доступ к элементам
- •Увеличение размера массива
- •Вставки и удаления
- •Операции
- •20.3.3.Члены класса cList
- •Параметры
- •Возвращаемое значение
- •Замечания
- •Параметры
- •Возвращаемое значение
- •20.3.4.Использование простых ассоциативных массивов
- •20.4.Использование шаблонов коллекций типизированных указателей
- •20.4.1.Использование массивов и списков типизированных указателей
- •20.4.2.Использование типизированных указателей на ассоциативные массивы
- •20.5.Использование контейнера vector
- •20.5.1.Конструкторы
- •Пример использования конструкторов
- •20.5.4.Иллюстрация использования класса vector
- •21.Алгоритмы
- •21.1.Общие соглашения
- •21.2.Итераторы
- •21.3.Функциональные объекты
- •21.4.Распределители
- •21.5.Состав библиотеки алгоритмов
- •21.6.Немодифицирующие алгоритмы
- •21.7.Пример использования шаблонной функции sort() из библиотеки алгоритмов
- •21.8.Сортировка массива объектов пользовательского класса
- •21.9.Еще одна иллюстрация некоторых алгоритмов на примере обработки числового массива
- •22.Профилирование программы в Microsoft Visual Studio 6.0
- •23.Некоторые функции api Win32
- •23.1.Получение информации о компьютере и операционной системе
- •23.1.1.Функция GetLogicalDrives
- •23.1.2.Функция GetDriveType
- •23.1.3.Функция GetDriveType
- •23.1.4.Функция GetDiskFreeSpaceEx
- •23.1.5.Функция GlobalMemoryStatus
- •23.1.6.Функции GetComputerName, GetUserNameA
- •23.1.7.Функции GetSystemDirectory, GetTempPath, GetWindowsDirectory, GetCurrentDirectory
- •23.1.8.Функция GetSystemInfo
- •24.Разное-всякое
- •24.1.Русификация приложений
- •24.2.Помощь и всплывающие подсказки
- •24.3.Использование ini-файла
- •24.3.1.Ansi-версия программы для среды mvs 6.0.
- •24.3.2.Unicode-версия программы для ис mvs-2005 и mvs-2008.
- •24.3.3.Ansi-версия программы для ис mvs-2005.
- •24.3.4.Ansi-версия программы для ис mvs-2008
- •24.4.Установка размеров и положения главного окна-рамки приложения
- •24.5.Создание дополнительного потока в консольном приложении
- •24.6.Интеллектуальные указатели
- •24.7.Управление формой курсора мыши
- •24.8.Как выйти из длительного цикла
- •24.9.Получение изображения содержимого окна
- •Сохранение изображения в файле
- •0, // Первая строка развертки, которая должна
- •0, // Число копируемых линий
- •Int I; // Количество выбираемых линий
- •0, // Первая строка развертки, которая должна быть выбрана
- •0, // Число копируемых линий
- •0, // Первая выбираемая линия для изображения назначения
- •0, // Режим использования
- •24.10.Подстройка очертания окна под контур изображения
- •24.11.Как корректно завершить приложение с графическим интерфейсом из него самого
- •24.12.Обработка ошибок ввода
- •25.Интегрированная среда Microsoft Visual Studio 2005
- •25.1.Терминология
- •25.2.Свойства решения и проекта
- •25.3.Что обозначают иконки на вкладке Class View
- •26.О справочной системе msdn версий 6.0 и 2005
- •26.1.Примеры приложений (версия 6.0)
- •26.2.Учебные пособия (tutorials)
- •26.3.Примеры приложений из msdn-2005
- •26.3.1.Примеры приложений mfc (mfc samples)
- •27.Процессы и потоки
- •27.1.Основные понятия Понятие приложений, процессов и потоков
- •Текущие диск и каталог для процесса
- •Определение версии системы
- •Когда полезно создавать потоки
- •Когда многопоточность неэффективна
- •Механизм многопоточности Windows
- •Приостановка, возобновление и переключение потоков
- •Приостановка и возобновление процессов
- •27.2.Функция потока
- •Функция CreateThread
- •Завершение потока
- •Часть2.Технология сом
- •28.Краткий обзор концепций программирования
- •29.Обзор технологии .Net и c#
- •29.1.Введение
- •29.2.Характеристика платформы .Net Framework
- •Среда разработки: Microsoft Visual Studio
- •Язык f#
- •29.3.Пример консольного приложения
- •29.4.Класс стек на основе связного списка
- •29.5.Чтение текстового файла
- •30.Предпосылки возникновения com
- •31.Межпроцессное взаимодействие
- •34.Введение в com технологии
- •34.1.Основные понятия и определения
- •34.2.Технология com как спецификация и реализация
- •34.3.Составляющие приложений com
- •35.Способы реализации сом серверов
- •35.1.Виды серверов и их основные характеристики
- •35.2.Алгоритм взаимодействия клиента с внутрипроцессным сервером
- •Последовательность действий при вызове клиентом внутрипроцессного сервера.
- •Последовательность действий при вызове клиентом локального или удаленного сервера
- •36.Интерфейсы
- •37.Доступ к серверу с помощью пользовательских интерфейсов
- •38.Доступ к серверу с помощью интерфейса iDispatch
- •38.1.Сценарий для версии mvs 6.0
- •38.2.Сценарий для версии mvs 2005
- •38.3.Доступ к серверу Excel в mvs 2005 с помощью диспетчерского интерфейса
- •39.Применение интеллектуальных указателей для доступа к серверам
- •39.1.Импорт библиотеки типов
- •39.2.Доступ к серверу SolidWorks 2003 с помощью интеллектуальных указателей
- •39.3.Доступ к серверу SolidWorks 2007 с помощью интеллектуальных указателей
- •39.4.Доступ к серверу Microsoft Word с помощью интеллектуальных указателей из консольного приложения
- •39.5.Доступ к серверу Microsoft Word с помощью интеллектуальных указателей из gui-приложения
- •40.Внедрение и связывание объектов
- •40.1.Понятие внедрения и связывания объектов
- •40.2.Серверы и контейнеры
- •41.Обработка ошибок
- •41.1.Функция SetErrorMode – управление реакцией программы на ошибочные состояния
- •41.2.Функции GetLastError и SetLastError – получение кода ошибки и его установка
- •41.3.Коды ошибок hresult
- •41.4.Получение текстов сообщений об ошибках
- •42.Типы данных сом
- •42.1.Типы данных методов и свойств сом объектов
- •43.Приложения
- •43.1.Словарь терминов
- •43.2.О регистрации внутрипроцессного сервера сом
- •5. Степанов а., Менг Ли. Руководство по стандартной библиотеке шаблонов (stl)/ Пер. На русский а.Суханова и а.Кутырина – м.: 1999.
- •Список литературы по платформе .Net
- •9. Дон Бокс, Крис Селлз. Основы платформы .Net, том 1. Общеязыковая исполняющая среда /Пер. С англ. – м.; сПб.: к.: Издательский дом "Вильямс", 2003. – с.288. Isbn 5-8459-0455-2
- •10. Деймьен Уоткинз, Марк Хаммонд, Брэд Эйбрамз. Программирование на платформе .Net среда /Пер. С англ. – м.; сПб.: к.: Издательский дом "Вильямс", 2003. – с.368. Isbn 5-8459-0456-0
- •11. Джеффри Рихтер. Clr via c#. Программирование на платформе Microsoft .Net Framework 2.0 на языке c#. Мастер-класс / Пер. С англ. – м.:Издательство «Русская редакция»; сПб.: Питер, 2007. - 656с.
- •12. Джеффри Рихтер. Программирование на платформе Microsoft .Net Framework / Пер. С англ. – м.:Издательско-торговый дом «Русская редакция», 2003 - 512с.
- •14. Пауэрс Ларс, Майкл Снелл. Microsoft Visual Studio 2008 / Пер. С англ. — сПб.:
- •Список литературы по технологии сом
- •13. Дейл Роджерсон. Основы сом/Пер. С англ.–2-е изд., исправл. И дополн.–м,:Изд.-торг. Дом «Русская редакция».–2000, 400с.
- •15. Дэвид Чеппел. Технология ActiveX и ole/ Пер. С англ. – м.: Издательский отдел "Русская редакция" тоо "Channel Traiding Ltd.", 1999. – 320с.
- •16. Бокс д. Сущность технологии сом. Библиотека программиста. — сПб.: Питер, 2001. — 400 с.: ил. (Есть в электронном формате)
- •17. К. Таваре, к. Фертитта, б. Ректор, к. Селлз. Библиотека atl 8: внутренняя структура и применение. Microsoft Visual Studio 2005. – м.; сПб.:, к.: Издательский дом "Вильямс", 2007, 736с.
Пример использования конструкторов
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int>::iterator v1_Iter, v2_Iter, v3_Iter, v4_Iter, v5_Iter;
// 1 Create an empty vector v0
vector <int> v0;
// 3 Create a vector v1 with 3 elements of default value 0
vector <int> v1( 3 );
// 4 Create a vector v2 with 5 elements of value 2
vector <int> v2( 5, 2);
// 5 Create a vector v3 with 3 elements of value 1 and with the
// allocator of vector v2
vector <int> v3( 3, 1, v2.get_allocator( ) );
// 6 Create a copy, vector v4, of vector v2
vector <int> v4( v2 );
// Create a vector v5 by copying the range v4[_First, _Last)
vector <int> v5( v4.begin( ) + 1, v4.begin( ) + 3 );
cout << "v1 =" ;
for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
cout << " " << *v1_Iter;
cout << endl;
cout << "v2 =" ;
for ( v2_Iter = v2.begin( ) ; v2_Iter != v2.end( ) ; v2_Iter++ )
cout << " " << *v2_Iter;
cout << endl;
cout << "v3 =" ;
for ( v3_Iter = v3.begin( ) ; v3_Iter != v3.end( ) ; v3_Iter++ )
cout << " " << *v3_Iter;
cout << endl;
cout << "v4 =" ;
for ( v4_Iter = v4.begin( ) ; v4_Iter != v4.end( ) ; v4_Iter++ )
cout << " " << *v4_Iter;
cout << endl;
cout << "v5 =";
for ( v5_Iter = v5.begin( ) ; v5_Iter != v5.end( ) ; v5_Iter++ )
cout << " " << *v5_Iter;
cout << endl;
}
Результат выполнения программы:
v1 = 0 0 0
v2 = 2 2 2 2 2
v3 = 1 1 1
v4 = 2 2 2 2 2
v5 = 2 2
20.5.2.Функции-члены класса vector
20.5.2.1.Функция vector::assign()
Уничтожает вектор и копирует указанные элементы во вновь созданный вектор.
void assign( size_type _Count, const Type& _Val);
template<class InputIterator>
void assign(InputIterator _First, InputIterator _Last);
Параметры
_First
Позиция первого элемента вектора, который будет копироваться.
_Last
Позиция первого элемента вектора за границей диапазона элементов, которые будут копироваться.
_Count
Количество копий элемента, которое должно быть вставлено в вектор.
_Val
Значение элемента, которое должно быть вставлено в вектор.
Замечания
После удаления всех существующих элементов вектора функция assign() вставляет заданный диапазон значений из исходного вектора или вставляет указанное число элементов _Count с заданным значением _Val в вектор.
Пример
#include <vector>
int main( )
{
vector <int> v1,v2,v3;
vector <int>::iterator Iter;
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );
v1.push_back( 40 );
v1.push_back( 50 );
cout << "v1 = " ;
for ( Iter = v1.begin(); Iter != v1.end();Iter++) cout << *Iter << " ";
cout << endl;
v2.assign(v1.begin()+1, v1.end());
cout << "v2 = ";
for (Iter = v2.begin(); Iter != v2.end(); Iter++)
cout << *Iter << " ";
cout << endl;
v3.assign(7, 4) ;
cout << "v3 = ";
for (int i = 0; i<v3.size(); i++)
cout << v3[i] << " ";
cout << endl;
cout<<"v1==v2 = "<<(v1==v2)<<endl;
}
Вывод программы
v1 = 50 10 20 30 40
v2 = 20 30 40 50
v3 = 4 4 4 4 4 4 4
v1==v2 = 0
20.5.2.2.Функция vector::at()
Возвращает ссылку на элемент в указанной позиции вектора.
reference at(size_type _Pos);
const_reference at(size_type _Pos) const;
Параметр
_Pos
Позиция (индекс) элемента вектора, на который будет получена ссылка.
Возвращаемое значение
Ссылка на указанный элемент. Если значение _Pos вне диапазона, возникает ИС out_of_range.
Замечания
Если возвращаемое значение присваивается константной ссылке, то вектор не может быть модифицирован, а в противном случае – может.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 10 );
v1.push_back( 20 );
const int &i = v1.at( 0 );
int &j = v1.at( 1 );
cout << "The first element is " << i << endl;
cout << "The second element is " << j << endl;
}
Вывод программы
The first element is 10
The second element is 20
20.5.2.3.Функция vector::back()
Возвращает ссылку на последний элемент вектора.
reference back( );
const_reference back( ) const;
Возвращаемое значение
Последний элемент вектора. Если вектор пустой, то возвращаемое значение не определено.
Замечания
Если возвращаемое значение присваивается константной ссылке, то вектор не может быть модифицирован, а в противном случае – может.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 10 );
v1.push_back( 11 );
int& i = v1.back( );
const int& ii = v1.front( );
cout << "The last integer of v1 is " << i << endl;
i--;
cout << "The next-to-last integer of v1 is "<< ii << endl;
}
Вывод программы
The last integer of v1 is 11
The next-to-last integer of v1 is 10
20.5.2.4.Функция vector::begin()
Возвращает итератор произвольного доступа, указывающий на первый элемент вектора
const_iterator begin() const;
iterator begin();
Возвращаемое значение
Итератор, указывающий на первый элемент вектора. Если вектор пустой, то он указывает на позицию, следующую за пустым вектором.
Замечания
Если возвращаемое значение присваивается константной ссылке, то вектор не может быть модифицирован, а в противном случае – может.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> c1;
vector <int>::iterator c1_Iter;
vector <int>::const_iterator c1_cIter;
c1.push_back( 1 );
c1.push_back( 2 );
c1_Iter = c1.begin( );
cout << "Первый элемент c1 равен "<< *c1_Iter << endl;
*c1_Iter = 20;
c1_Iter = c1.begin( );
cout << " Теперь первый элемент c1 равен "<< *c1_Iter << endl;
// Следующая строка ошибочна, поскольку итератор константный
// *c1_cIter = 200;
}
Вывод программы
Первый элемент c1 равен 1
Теперь первый элемент c1 равен 20
20.5.2.5.Функция vector:: capacity()
Возвращает число элементов, которые вектор может содержать без распределения дополнительной памяти. В то время как size() возвращает текущее число элементов, capacity() возвращает зарезервированное.
size_type capacity( ) const;
Возвращаемое значение
Текущее число элементов вектора.
Замечания
Функции resize() и reserve() можно использовать для резервирования памяти для вектора.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 1 );
v1.push_back( 2 );
cout << "The length of storage allocated is "
<< v1.capacity( ) << "." << endl;
v1.reserve(5);
cout << "The length of storage allocated is now "
<< v1.capacity( ) << "." << endl;
}
Вывод программы
The length of storage allocated is 2.
The length of storage allocated is now 5.
20.5.2.6.Функция vector::clear()
Удаляет элементы вектора.
void clear( );
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );
cout << "The size of v1 is " << v1.size( ) << endl;
v1.clear( );
cout << "The size of v1 after clearing is " << v1.size( ) << endl;
}
Вывод программы
The size of v1 is 3
The size of v1 after clearing is 0
20.5.2.7.Функция vector:: empty()
Возвращает TRUE, если вектор пустой.
bool empty( ) const;
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 10 );
if ( v1.empty( ) ) cout << "The vector is empty." << endl;
else cout << "The vector is not empty." << endl;
}
Вывод программы
The vector is not empty.
20.5.2.8.Функция vector::end()
Возвращает итератор произвольного доступа, указывающий на элемент вектора, следующий за последним.
iterator end( );
const_iterator end( ) const;
Замечания
Если возвращаемое значение присваивается переменной типа const_iterator, то вектор не может быть модифицирован, а если переменной типа iterator – может.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
vector <int>::iterator v1_Iter;
v1.push_back( 1 );
v1.push_back( 2 );
for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
cout << *v1_Iter << endl;
}
Вывод программы
1
2
20.5.2.9.Функция vector::erase()
Удаляет один или несколько элементов вектора, начиная с указанной позиции.
iterator erase(iterator _Where);
iterator erase( iterator _First, iterator _Last );
Параметр
_Where
Позиция элемента вектора, который должен быть удален.
_First
Позиция первого элемента вектора, который должен быть удален.
_Last
Позиция сразу за последним элементом вектора, который должен быть удален.
Возвращаемое значение
Итератор, указывающий на первый элемент массива за последним удаленным или указатель на конец вектора, если он пуст.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
vector <int>::iterator Iter;
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );
v1.push_back( 40 );
v1.push_back( 50 );
cout << "v1 =" ;
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter;
cout << endl;
v1.erase( v1.begin( ) );
cout << "v1 =";
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter;
cout << endl;
v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
cout << "v1 =";
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter;
cout << endl;
}
Вывод программы
v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50
20.5.2.10.Функция vector::front()
Возвращает ссылку на первый элемент вектора
reference front( );
const_reference front( ) const;
Возвращаемое значение
Ссылка на первый элемент вектора. Если вектор пустой, то значение не определено.
Замечания
Если возвращаемое значение присваивается константной ссылке, то вектор не может быть модифицирован, а в противном случае – может.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 10 );
v1.push_back( 11 );
int& i = v1.front( );
const int& ii = v1.front( );
cout << "The first integer of v1 is "<< i << endl;
i++;
cout << "The second integer of v1 is "<< ii << endl;
}
Вывод программы
The first integer of v1 is 10
The second integer of v1 is 11
20.5.2.11.Функция vector:: get_allocator()
Возвращает копию объекта, который используется классом вектор для распределения памяти.
Allocator get_allocator( ) const;
Возвращаемое значение
Распределитель памяти, используемый вектором.
Замечания
Распределитель памяти по умолчанию применим для решения большинства задач, но вместе с тем Вы можете разработать и использовать свой собственный распределитель памяти.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
// В следующих строках объявляются объекты, которые использует распределитель
// памяти по умолчанию
vector<int> v1;
vector<int, allocator<int> > v2 = vector<int, allocator<int> >(allocator<int>( ));
// v3 будет использовать тот же распределитель, что и v1
vector <int> v3( v1.get_allocator( ) );
vector<int>::allocator_type xvec = v3.get_allocator( );
// Здесь можно вызывать функции распределителя памяти
}
20.5.2.12.Функция vector:: insert()
Вставляет один или несколько элементов вектора, начиная с указанной позиции.
iterator insert( iterator _Where, const Type& _Val );
void insert( iterator _Where, size_type _Count, const Type& _Val );
template<class InputIterator>
void insert(iterator _Where,InputIterator _First,InputIterator _Last);
Параметр
_Where
Позиция вектора, куда вставляется первый элемент
_Val
Значение элемента, который вставляется в вектор
_Count
Количество вставляемых элементов
_First
Позиция первого элемента диапазона копируемых элементов
_Last
Позиция первого элемента, следующего за границей диапазона копируемых элементов
Возвращаемое значение
Итератор, указывающий на позицию, куда новый элемент был вставлен
Замечания
Любая операция вставки может быть дорогостоящей
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
vector <int>::iterator Iter;
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );
cout << "v1 =" ;
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter;
cout << endl;
v1.insert( v1.begin( ) + 1, 40 );
cout << "v1 =";
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter;
cout << endl;
v1.insert( v1.begin( ) + 2, 4, 50 );
cout << "v1 =";
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter;
cout << endl;
v1.insert( v1.begin( )+1, v1.begin( )+2, v1.begin( )+4 );
cout << "v1 =";
for (Iter = v1.begin( ); Iter != v1.end( ); Iter++ ) cout << " " << *Iter;
cout << endl;
}
Вывод программы
v1 = 10 20 30
v1 = 10 40 20 30
v1 = 10 40 50 50 50 50 20 30
v1 = 10 50 50 40 50 50 50 50 20 30
20.5.2.13.Функция vector::max_size()
Возвращает максимально возможное число элементов вектора
size_type max_size( ) const;
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
vector <int>::size_type i;
i = v1.max_size( );
cout << "The maximum possible length of the vector is " << i << "." << endl;
}
Вывод программы
The maximum possible length of the vector is 1073741823.
20.5.2.14.Функция vector::pop_back()
Удаляет последний элемент вектора, который не должен быть пустым
void pop_back( );
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 1 );
cout << v1.back( ) << endl;
v1.push_back( 2 );
cout << v1.back( ) << endl;
v1.pop_back( );
cout << v1.back( ) << endl;
}
Вывод программы
1
2
1
20.5.2.15.Функция vector::push_back()
Добавляет элемент в конец вектора
void push_back(const Type& _Val );
Параметр
_Val
Значение вставляемого элемента вектора.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 1 );
if ( v1.size( ) != 0 ) cout << "Last element: " << v1.back( ) << endl;
v1.push_back( 2 );
if ( v1.size( ) != 0 ) cout << "New last element: " << v1.back( ) << endl;
}
Вывод программы
Last element: 1
New last element: 2
20.5.2.16.Функция vector::rbegin()
Возвращает итератор произвольного доступа, указывающий на первый элемент реверсированного вектора
reverse_iterator rbegin( );
const_reverse_iterator rbegin( ) const;
Замечания
Если возвращаемое значение присваивается константному итератору, то вектор не может быть модифицирован, а в противном случае – может.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
vector <int>::iterator v1_Iter;
vector <int>::reverse_iterator v1_rIter;
v1.push_back( 1 );
v1.push_back( 2 );
v1_Iter = v1.begin( );
cout << "The first element of vector is "<< *v1_Iter << "." << endl;
v1_rIter = v1.rbegin( );
cout << "The first element of the reversed vector is "<< *v1_rIter << "." << endl;
}
Вывод программы
The first element of vector is 1.
The first element of the reversed vector is 2.
20.5.2.17.Функция vector::rend ()
Возвращает итератор произвольного доступа, указывающий на элемент, следующий за последним элементом реверсированного вектора.
const_reverse_iterator rend( ) const;
reverse_iterator rend( );
Замечания
Функция rend() применяется к реверсированному вектору так же, как end() к обычному вектору. Если возвращаемое значение присваивается константной ссылке, то вектор не может быть модифицирован, а в противном случае – может. Эта функция может использоваться для проверки того, достиг ли реверсированный итератор конца вектора. Значение, возвращаемое rend(), не должно разыменовывааться.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
vector <int>::reverse_iterator v1_rIter;
v1.push_back( 1 );
v1.push_back( 2 );
for ( v1_rIter = v1.rbegin( ) ; v1_rIter != v1.rend( ) ; v1_rIter++ )
cout << *v1_rIter << endl;
}
Вывод программы
2
1
20.5.2.18.Функция vector::reserve()
Резервирует минимальную длину вектора и, при необходимости, перераспределяет память для вектора.
void reserve(size_type _Count );
Параметр
_Count
Минимальная длина вектора.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
//vector <int>::iterator Iter;
v1.push_back( 1 );
cout << "Current capacity of v1 = "<< v1.capacity( ) << endl;
v1.reserve( 20 );
cout << "Current capacity of v1 = "<< v1.capacity( ) << endl;
}
Вывод программы
Current capacity of v1 = 1
Current capacity of v1 = 20
20.5.2.19.Функция vector::resize()
Устанавливает новую длину вектора.
void resize( size_type _Newsize);
void resize( size_type _Newsize, Type _Val);
Параметр
_Newsize
Новая длина вектора.
_Val
Значение, которое присваивается добавляемым элементом вектора.
Замечания
Если размер контейнера меньше чем запрашиваемый размер _Newsize, то элементы будут добавляться до тех пор, пока не будет достигнут заданный размер. Если текущий размер вектора тот же, что и _Newsize, никаких действий не выполняется. Функция size() возвращает текущий размер вектора.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );
v1.resize( 4,40 );
cout << "The size of v1 is " << v1.size( ) << endl;
cout << "The value of the last object is " << v1.back( ) << endl;
v1.resize( 5 );
cout << "The size of v1 is now " << v1.size( ) << endl;
cout << "The value of the last object is now " << v1.back( ) << endl;
}
Вывод программы
The size of v1 is 4
The value of the last object is 40
The size of v1 is now 5
The value of the last object is now 0
20.5.2.20.Функция vector::size()
Возвращает число элементов вектора
size_type size( ) const;
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
vector <int>::size_type i;
v1.push_back( 1 );
i = v1.size( );
cout << "Vector length is " << i << "." << endl;
v1.push_back( 2 );
i = v1.size( );
cout << "Vector length is now " << i << "." << endl;
}
Вывод программы
Vector length is 1.
Vector length is now 2.
20.5.2.21.Функция vector::swap()
Меняет местами значения двух векторов.
void swap( vector& _Right );
friend void swap(vector<Type, Allocator >& _Left,
vector<Type, Allocator >& _Right);
Параметр
_Right, _Left
Векторы, элементы которых свопируются
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1, v2;
v1.push_back( 1 );
v1.push_back( 2 );
v1.push_back( 3 );
v2.push_back( 10 );
v2.push_back( 20 );
cout << "The number of elements in v1 = " << v1.size( ) << endl;
cout << "The number of elements in v2 = " << v2.size( ) << endl;
cout << endl;
v1.swap( v2 );
cout << "The number of elements in v1 = " << v1.size( ) << endl;
cout << "The number of elements in v2 = " << v2.size( ) << endl;
}
Вывод программы
The number of elements in v1 = 3
The number of elements in v2 = 2
The number of elements in v1 = 2
The number of elements in v2 = 3
20.5.3.Перегруженные операции класса vector
20.5.3.1.Операция []
Возвращает ссылку на элемент в указанной позиции.
reference operator[]( size_type _Pos );
const_reference operator[](size_type _Pos) const;
Параметр
_Pos
Позиция (индекс) элемента вектора
Замечания
Если возвращаемое значение присваивается константной ссылке, то вектор не может быть модифицирован, а в противном случае – может. Если _Pos>=Size(), то возвращаемое значение не определено.
Пример
#include <vector>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
v1.push_back( 10 );
v1.push_back( 20 );
int& i = v1[1];
cout << "The second integer of v1 is " << i << endl;
}
Вывод программы
The second integer of v1 is 20
20.5.3.2.Операции сравнения
Следующие перегруженные операции выполняют сравнение содержимого двух векторов. Сравнение элементов выполняется аналогично тому, как сравниваются строки символов. Это значит, что элементы массивов сравниваются попарно до тех пор, пока не встретятся отличающиеся элементы, результат сравнения которых и определяет результат операции в целом.
template<class T, class A>
bool operator==(operator
const vector<T, A>& lhs,
const vector<T, A>& rhs);
template<class T, class A>
bool operator!=(
const vector<T, A>& lhs,
const vector<T, A>& rhs);
template<class T, class A>
bool operator< (
const vector<T, A>& lhs,
const vector<T, A>& rhs);
template<class T, class A>
bool operator> (
const vector<T, A>& lhs,
const vector<T, A>& rhs);
template<class T, class A>
bool operator<=(
const vector<T, A>& lhs,
const vector<T, A>& rhs);
template<class T, class A>
bool operator>=(
const vector<T, A>& lhs,
const vector<T, A>& rhs);
Пример
typedef vector <int> intVec;
void PrintRes(intVec &v1,intVec &v2)
{ int i;
cout<<" v1=";
for(i=0;i<v1.size();i++) cout<<' '<<v1[i];
cout<<endl;
cout<<" v2=";
for(i=0;i<v2.size();i++) cout<<' '<<v2[i];
cout<<endl;
if(v1==v2) cout<<"v1==v2"; else
if(v1>v2) cout<<"v1>v2"; else
if (v1<v2) cout<<"v1<v2"; else
if(v1>=v2) cout<<"v1>=v2"; else
if(v1<=v2) cout<<"v1<=v2";
cout<<endl;
}
int main()
{
intVec v1,v2;
v1.push_back(10); v1.push_back(20);
v2.push_back(10); v2.push_back(20);
PrintRes(v1,v2);
v2[1]=22;
PrintRes(v1,v2);
v2[1]=2;
PrintRes(v1,v2);
v1.push_back(30); v2.push_back(40);
PrintRes(v1,v2);
v1.pop_back();
PrintRes(v1,v2);
}
Вывод программы
v1= 10 20
v2= 10 20
v1==v2
v1= 10 20
v2= 10 22
v1<v2
v1= 10 20
v2= 10 2
v1>v2
v1= 10 20 30
v2= 10 2 40
v1>v2
v1= 10 20
v2= 10 2 40
v1>v2
