Вектори (vector)

 

Для створення вектору можна скористатися наступними конструкторами (приведений спрощений запис):

 

explicit vector(); //1

explicit vector(size_type n,const Т&value=T()); //2

template <class InputIter> // 3

vector(InputIter first, InputIter last);

vector(const vector<T>& x); //4

 

Ключове слово explicit використовується для того, щоб при створенні об'єкту заборонити виконувати неявно перетворення при наданні значення іншого типу. Конструктор 1 є конструктором за умовчанням. Конструктор 2 створює вектор довжиною n і заповнює його однаковими елементами-копіями value. Оскільки зміна розміру вектора займає певний час, при його створенні задавати початковий розмір дуже корисно. При цьому для вбудованих типів виконується ініціалізація кожного елементу значенням value.Якщо воно не вказане, елементи глобальних векторів ініціалізуються нулем. Якщо тип елементу вектора визначений користувачем, початкове значення формується за допомогою конструктору за умовчанням для даного типу. На місці другого параметра можна написати виклик конструктору з параметрами, створивши таким чином вектор елементів з необхідними властивостями.

ПРИМІТКА.Елементи будь-якого контейнера є копіями об'єктів, що вставляються в нього. Тому для них мають бути визначені конструктор копіювання і операція привласнення.

Конструктор 3 створює вектор шляхом копіювання вказаного за допомогою ітераторів діапазону елементів. Тип ітераторів має бути "для читання". Конструктор 4 є конструктором копіювання.

Приклади конструкторів:

 

// Створюється вектор з 10 рівних одиниці елементів

vector <int> v1 (10, 1);

// Создается вектор, равный вектору v1

vector <int> v2 (v1);

// Створюється вектор з 2 елементів, рівних першим двом елементам vl

vector <int> v3 (v1.begin(), v1.begin() + 2);

// Створюється вектор з 10 об'єктів класу monstr

// (працює конструктор за умовчанням);

vector <monstr> m1 (10);

// Створюється вектор з 5 об'єктів класу monstr із заданим ім'ям

// (працює конструктор з параметром char*);

vector <monstr> m2 (5, monstr("Bacя"));

 

У шаблоні vector визначені операція привласнення і функція копіювання:

 

vector<T>& operator=(const vector<T>& х);

void assign(size_type n, const Т& value);

template <class InputIter>;

void assign(InputIter first, InputIter last);

 

Тут через Т позначений тип елементів вектора. Вектори можна привласнювати один одному точно так, як і стандартні типи даних або рядка. Після привласнення розмір вектора стає рівним новому значенню, всі старі елементи видаляються. Функція assign в першій формі аналогічна по дії конструктору 2, але застосовується до існуючого об'єкту. Функція assign в другій формі призначена для привласнення елементам вектора значень з діапазону, який визначається ітераторами first і last, аналогічно конструктору 3, наприклад:

 

vector <int> v1, v2;

// Першим 10 елементам вектора v1 привласнюється значення 1;

v1.assign (10, l);

 

Доступ до елементів вектора здійснюється за допомогою наступних операторі та методів:

 

reference operator[](size_type n);

const_reference operator[](size_type n) const;

const_reference at(size_type n) const;

reference at(size_type n);

reference front();

const_reference front() const;

reference back();

const_reference back() const;

 

Оператор [] здійснює доступ до елементу вектора по індексу без перевірки його виходу за межу вектора. Функція atвиконує таку перевірку і породжує виключення out_of_rangeу разі виходу за межу вектора. Природно, що функція atпрацює повільніше, ніж оператор [], тому у випадках, коли діапазон визначений явно, переважно користуватися оператором []:

 

for (int i = 0; i<v.size(); i++) cout <<v[i]<< " ";

 

В іншому випадку використовується функція atз обробкою виключення:

 

try

{

//...

v.at(i) = v.at(...);

}

catch (out_of_range) { ... }

 

Операції доступу повертають значення посилання на елемент (reference) або константного посилання (const_reference) залежно від того, чи застосовуються вони до константного об'єкту чи ні. Методи front() і back() повертають посилання відповідно на перший і останній елементи вектора (це не те ж саме, що begin() – вказівка па перший елемент і end() – вказівка на елемент, наступний за останнім. Приклад:

 

vector <int> v(5, 10);

v.front() = 100; v.back() = 100;

cout<<v[0]<<" "<<v[v.size() - 1];//Виведення: 100 100

 

Функція capacity визначає розмір оперативної пам'яті,яку займає вектор:

 

size_type capacity() const;

 

Пам'ять під вектор виділяється динамічно, але не під один елемент в кожен момент часу (це було б марнотратним витрачанням ресурсів), а відразу під групу елементів, наприклад, 256 або 1024. Перерозподіл пам'яті відбувається тільки при перевищенні цієї кількості елементів, при цьому об'єм виділеного простору подвоюється. Після перерозподілу будь-які ітератори, що посилаються на елементи вектора, стають недійсними, оскільки вектор може бути переміщений в іншу ділянку пам'яті, і не можна чекати, що пов'язані з ним посилання будуть оновлені автоматично. Існує також функція виділення пам'яті reserve,яка дозволяє задати, скільки пам'яті вимагається для зберігання вектора:

 

void reserve(size_tyре n);

 

Приклад застосування функції:

 

vector <int> v;

v.reserve(1000);//Виділення пам'яті під 1000 елементів

Після виконання цієї функції значення функції capacity буде рівне щонайменше n. Функцію reserve корисно застосовувати тоді, коли розмір вектору відомий заздалегідь.

Для зміни розмірів вектора застосовується функція resize:

 

void resize(size_type sz, Т с = Т());

 

Ця функція збільшує або зменшує розмір вектора залежно від того, більше значення sz, яке задається, чим значення size(), або менше. Другий параметр задає значення, яке привласнюється всім новим елементам вектора. Вони поміщуються в кінець вектора. Якщо новий розмір менший, ніж значення size(), з кінця вектора видаляється (size() – sz) елементів.

Визначені наступні методи для зміни об'єктів класу vector:

 

void push_back(const Т& value);

void pop_back();

iterator insert(iterator position, const T& value);

void insert(iterator position,size_type n,const T&value);

template <class InputIter>

void insert(iterator position, InputIter first,

InputIter last);

iterator erase(iterator position);

iterator erase(iterator first, iterator last);

void swap();

void clear(); // Очистка вектора

 

Функція pushback додає елемент в кінець вектора, функція рорbаск – видаляє елемент з кінця вектора. Функція insert призначена для вставки елементу у вектор. Перша форма функції вставляє елемент value в позицію, задану першим параметром (ітератором), і повертає ітератор, що посилається на вставлений елемент. Друга форма функції вставляє у вектор n однакових елементів. Третя форма функції дозволяє вставити декілька елементів, які можуть бути задані будь-яким діапазоном елементів відповідного типу, наприклад:

 

#include <iostream>

#include <vector>

using namespace std;

 








Дата добавления: 2014-12-26; просмотров: 755;


Поиск по сайту:

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

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.014 сек.