Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
new_mb.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
892 Кб
Скачать
☆

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;

}

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