- •3.8. Упражнения 49
- •Введение
- •1. Базовые элементы
- •1.1. Комментарии
- •1.2. Функция «main»
- •1.3. Идентификаторы и пространства имен
- •1.4. Типы
- •1.5. Переменные
- •1.7. Константы
- •1.6. Преобразование типов
- •1.8. Потоковый ввод – вывод
- •1.9. Операции
- •1.9.1. Арифметические операции
- •1.9.2. Поразрядные операции
- •1.9.3. Условный оператор
- •1.9.4. Операции отношения
- •1.9.5. Логические операции
- •1.10. Стандартные математические функции
- •1.11. Упражнения
- •2. Базовые конструкции
- •2.1 Ветвление
- •2.1.1. Конструкция «if – else»
- •2.1.2. Конструкция «switch»
- •2.2. Циклы
- •2.2.1. Цикл «for»
- •2.2.2. Цикл «while»
- •2.2.3. Цикл «do – while»
- •2.2.4. Операторы циклов
- •2.2.5. Вложенность
- •2.3. Упражнения
- •2.3.1. Ветвления
- •2.3.2. Циклы
- •2.3.3. Вложенность
- •3. Указатели. Массивы. Структуры
- •3.1. Указатели
- •3.2. Массивы
- •3.2.1. Статические массивы
- •3.2.2. Динамические массивы
- •3.4. Ссылки
- •3.5. Структуры
- •3.6. Объединение
- •3.7. Переопределение типов
- •3.8. Упражнения
- •3.8.1. Статические и динамические массивы
- •3.8.2. Многомерные массивы
- •3.8.3. Строки
- •4. Функции
- •4.1. Простые функции
- •4.2. Рекурсия
- •4.3. Указатели и ссылки
- •4.3.1. Передаваемые параметры
- •4.3.2. Возвращаемые значения
- •4.3.3. Ссылки и структуры в функциях
- •4.3.4. Указатели и массивы в функциях
- •4.3.5. Указатели и ссылки на функцию
- •4.4. Шаблоны функций
- •4.5. Упражнения
- •4.5.1. Простые функции
- •4.5.2. Параметры – ссылки и параметры — указатели
- •5. Стандартные классы
- •5.1. Класс «pair»
- •5.2. Класс «complex»
- •5.3. Класс «string»
- •5.4. Контейнеры. Алгоритмы. Итераторы
- •5.5. Класс «vector»
- •5.6. Упражнения
- •5.6.1. Класс «string»
- •5.6.2. Класс «vector»
- •6. Файловый ввод – вывод
- •6.1. Операции
- •6.2. Методы
- •6.3. Флаги
- •6.4. Двоичный режим
- •6.5. Упражнения
- •Ллитература
5.5. Класс «vector»
Класс «vector» реализует массив с расширенными возможностями и представляет из себя полноценный контейнер. Такой массив доступен после включения заголовочного файла «vector». Он позволяет не только изменять элементы, но и добавлять новые и удалять существующие элементы, изменяя размер самого массива. Помимо операций удаления и вставки элементов данный класс поддерживает операции сравнения, получения количества элементов, операции по управлению выделением памяти и др.
Таблица 5.8. Конструкторы класса вектор.
Метод |
Описание |
vector() |
Создание пустого вектора |
vector(a) |
Создание вектора из a элементов со значением по умолчанию |
vector(a, b) |
Создание вектора из a элементов со значением b |
vector(c) |
Создание копии вектора c |
Движение по элементам вектора может осуществляться в обоих направлениях, в зависимости от типа итератора, при этом используются разные начальные значения итераторов: «begin» и «end» для прямого итератора «iterator», «rbegin» и «rend» для обратного «reverse_iterator».
Листинг 5.4. Класс vector.
#include <iostream>
#include <vector>
using namespace std;
//функция отображения элементов вектора;
void showvec(vector<int> & v)
{
cout << ": ";
for (int i = 0; i < v.size(); i++)
cout << v.at(i) << " ";
cout << endl;
}
int main (void)
{
int size;
cin >> size;
//создание вектора и задание значений его элементов;
vector<int> vec1;
for (int i = 0; i < size; i++)
vec1.push_back(i);
//создание вектора и инициализация значений;
//его элементов копирующим конструктором;
vector<int> vec2 = vector<int>(vec1);
showvec(vec1); //вывод элементов вектора;
showvec(vec2); //вывод элементов вектора;
cout << endl;
vec2.erase( vec2.end()-1 ); //удаление последнего элемента;
vec2.insert( vec2.begin(), vec1[0] ); //вставка элемента в первую позицию;
swap(vec1, vec2); //обмен векторов элементами;
showvec(vec1); //вывод элементов вектора;
showvec(vec2); //вывод элементов вектора;
cout << "vec1 " << (vec1 >= vec2 ? ">=" : "<") << " vec2" << endl;
//создание итераторов векторов и их инициализация первыми элементами;
vector<int>::iterator iter1 = vec1.begin();
vector<int>::iterator iter2 = vec2.begin();
cout << ": ";
//сравнение элементов вектора;
while ((iter1 != vec1.end()) && (iter2 != vec2.end()))
cout << (*iter1++ == *iter2++) << " ";
cout << endl << endl;
//изменение размера вектра;
vec1.resize(2);
//переопределение размера вектора и значений его элементов;
vec2.assign(2, 0);
showvec(vec1); //вывод элементов вектора;
showvec(vec2); //вывод элементов вектора;
cout << "vec1 == vec2 is " << boolalpha << ( vec1 == vec2 )<<endl<<endl;
vec1.clear(); //очистка вектора;
vec2 = vec1; //копирование векторов;
showvec(vec1); //вывод элементов вектора;
showvec(vec2); //вывод элементов вектора;
cout << boolalpha << ( !vec1.empty() && vec2.size() ) << endl;
return 0;
}
Для работы с векторами может быть использовано несколько обобщенных алгоритмов, описанных в файлах «algorithm» и «numeric» соответственно.
Таблица5.9. Некоторые стандартные обобщенные алгоритмы.
Название |
Описание |
accumulate |
Сумма инициирующего значения и значений элементов из диапазона (вместо суммы может быть использована указанная бинарная операция) |
copy |
Копирование последовательности элементов |
count |
Подсчет количества указанных элементов |
fill |
Заполняет диапазон элементов указанным значением |
find |
Поиск указанного значения и возврат указывающего на него итератора |
for_each |
Применяет указанную функцию к каждому элементу диапазона (функция не должна менять значения элементов) |
generate |
Заполняет диапазон элементов вызовом указанной функции |
max |
Определение большего из двух элементов |
max_element |
Определение наибольшего элемента |
merge |
Объединяет две отсортированные последовательности в одну |
min |
Определение меньшего из двух элементов |
min_element |
Определение наименьшего элемента |
random_shuffle |
Перестановка элементов из указанного диапазона в случайном порядке |
remove |
Удаление из диапазона элементов с указанным значением |
replace |
Замена элементов с указанным значением на элементы с новым |
reverse |
Изменение порядка следования элементов на противоположный |
rotate |
Перемещение всех элементов перед указанным в конец |
search |
Поиск подпоследовательности |
sort |
Переупорядочивание элементов по возрастанию |
swap |
Обмен указанных значений |
Листинг 5.5. Стандартные алгоритмы.
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
//функция отображения элементов вектора в обратном порядке;
void rshow (vector<int> & v)
{
vector<int>::reverse_iterator riter; //реверсивный итератор;
for (riter = v.rbegin(); riter < v.rend(); riter++)
cout << *riter << " ";
cout << endl;
}
int main (void)
{
const int size = 9;
vector<int> vect1;
vector<int> vect2(size);
for (int i = 1; i <= size; i++)
vect1.push_back(i);
rshow(vect1);
//подсчет суммы значений элементов;
cout << accumulate(vect1.begin(), vect1.end(), 0) << endl;
//сортировка по возрастанию;
sort(vect1.begin(), vect1.end(), greater<int>());
rshow(vect1);
//заполнение второго вектора элементами из первого;
copy(vect1.begin(), vect1.end(), vect2.begin());
rshow(vect2);
//поэлементное сравнение векторов;
cout << boolalpha << equal(vect1.begin(), vect1.end(), vect2.begin()) << endl;
const int elem = 5;
//удаление из вектора элемента со значением elem;
remove(vect1.begin(), vect1.end(), elem);
rshow(vect1);
//определение наличия элемента со значением elem;
if (find(vect1.begin(), vect1.end(), elem ) == vect1.end())
cout << "there is no \'" << elem << "\' element" << endl;
return 0;
}
Следует заметить, что вектор может быть и многомерным. Для этой цели в качестве типа вектора указывается не встроенный тип, а очередной вектор.
Листинг 5.6. Многомерный вектор.
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
const int size = 5;
//пять подвекторов;
vector<vector<int> > ivec(size);
//пять элементов в каждом подвекторе;
for (int i = 0; i < size; i++)
ivec[i].resize(size);
ivec[2][2] = 1;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
cout << ivec[i][j] << " ";
}
cout << endl;
}
return 0;
}
