Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

3.3. Вектор vector (пример 3.3)

Вектор - одномерный массив проиндексированных элементов. Вектор представляет собой пример наиболее полного стандартного контейнера. Для использования вектора стандартной библиотеки необходимо подключить файл с описанием вектора. При объявлении вектора (так же и других контейнеров) в треугольных скобках указывается тип данных элементов, хранящихся в векторе. Доступ к элементам вектора можно осуществлять через квадратные скобки, так же как и для обычных массивов.

Доступ к функциям вектора производится через оператор ".". Вектор – это особый тип данных, шаблон класса. Подробнее о классах и шаблонах см.главу 4 и раздел 5.4.

Для вектора не обязательно сразу указывать его размер, размер вектора можно изменить в любом месте программы при помощи функции resize(), а чтобы узнать размер вектора можно воспользоваться функцией size().

#include <vector>

using namespace std;

vector<double> x; // создание вектора

x.resize(10); // изменение размера вектора

x.resize(x.size()+100); // изменение размера вектора

double sum=0.0;

for(int i=0; i<x.size(); i++)

{

sum+=x[i]; //доступ по индексу

}

Полный список функций вектора см. Приложение 5.

Рассмотрим более подробно пример работы с вектором. Обратите внимание, что в этом примере вектор передается в функцию по ссылке, т.к. классы и массивы большого объема нерационально копировать каждый раз при вызове функции, что происходит при передачи по значению. Если функция не должна изменить содержимое контейнера, дополнительно указывается ключевое слово const.

/////////////////////////////////////////////////////////////////////////////

// Прикладное программирование

// Пример 3.3. Пример работы с контейнером vector

//

// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru

// СПб НИУ ИТМО

/////////////////////////////////////////////////////////////////////////////

#include <iostream> // подключение библиотеки ввода-вывода

#include <vector> // подключение описания вектора

#include <ctime> // для работы с таймером

using namespace std; // подключение стандартного пространства имен для использования библиотек

// прототипы функций

int min(const vector<double>& data);

void fill_rand(vector<double>& data, double max, double min);

/////////////////////////////////////////////////////////////////////////////

// пример передачи вектора в функцию

// функция находит индекс минимального числа в векторе

int min(const vector<double>& data)

{

int index=0;

double min=data[0];

for(int i=1; i<data.size(); ++i)

{

if(data[i]<min)

{

min=data[i];

index=i;

}

}

return index;

}

/////////////////////////////////////////////////////////////////////////////

// Функция заполнения вектора случайными числами

// data - вектор для заполнения

// max - максимальное число случайного диапазона

// min - минимальное число случайного диапазона

void fill_rand(vector<double>& data, double max, double min)

{

// устанавливает стартовую точку для генерации

// случайных чисел по текущему времени

srand((unsigned) clock());

for(int i=0; i<data.size(); ++i)

{

data[i]=(rand()*(max-min))/RAND_MAX+min;

}

}

/////////////////////////////////////////////////////////////////////////////

void main()

{

vector<double> x; // создание вектора

// ввод количества элементов в векторе

int n;

cout<<"input vector size: ";

cin>>n;

// 1. заполнение контейнера индексами

// заполнение контейнера

for(int i=0; i<n; i++)

{

// добавить элемент в конец контейнера

x.push_back(i);

}

// вывод всех элементов контейнера

cout<<endl<<"1. Vector filled with indexes: "<<endl;

for(int i=0; i<x.size(); i++)

{

cout<<x[i]<<" "; //доступ по индексу

}

// 2. заполнение контейнера случайными числами от 1 до 100

// очистить контейнер

x.clear();

// изменить размер

x.resize(20);

// заполнить случайными числами

fill_rand(x, 20, 80);

// вывод всех элементов контейнера

cout<<endl<<"2. Vector filled with random: "<<endl;

for(int i=0; i<x.size(); i++)

{

cout<<x[i]<<endl; //доступ по индексу

}

// вывод минимального числа в контейнере

cout<<endl<<"mininum is: "<<x[min(x)]<<endl; // x[min(x)] аналогично записи int i=min(x); x[i];

}

///////////////////////////////////////////////////////////////////////////////

При работе с вектором мы сталкиваемся с такими понятиями как размер и емкость. Размер - количество элементов, хранимых в контейнере, можно узнать с помощью функции size(), а изменить с помощью resize(). Операции push_back(), insert(), erase() также изменяют размеры вектора. Когда размеры вектора изменяются, то все его элементы могут быть перемещены в новую область памяти, поэтому хранить указатели на элементы вектора не имеет смысла и может быть опасно. Всегда нужно работать через итераторы (см.раздел 3.5).

С помощью функции empty() можно узнать о наличии элементов в контейнере. Если контейнер действительно пуст, то функция возвращает true.

bool res=x.empty(); // эквивалентно x.size() == 0

При работе с вектором можно выделить (зарезервировать) некоторую область памяти для потенциального расширения. Использование функции reserve() обеспечить выделение памяти для новых элементов контейнера. При этом вставка новых элементов или изменение размеров с помощью resize() не потребует перераспределения хранимого вектора в памяти. Определить "емкость" вектора можно с помощью функции capaсity().