Vector (C++)

Овој текст ја опишува имплементацијата на векторската предлошка во C++ Стандардната Библиотека.
Векторот е динамичка низа. Тој е еден од неколкуте податочни структури наречени ''container''. Тој се спроведува како предложна класа; тој е генеричка рамка која може да биде забрзана, на пр. како вектор од целобројни вредности, или пак вектор од стрингови (strings).
1 Дизајн
Векторската предлошка е дефинирана со ''<vector>''. Како и сите останати компоненти на стандардната библиотека, тој се наоѓа во namespace ''std.''
Посредникот го следи однесувањето на C низата ( способен е за брз и случаен пристап), но со додатна можност да може автоматски да се промени сам кога ќе биде внесен или избришан некој објект.
Векторската предлошка може да биде забрзана со било кој тип којшто ги исполнува CopyConstructible и Assignable побарувањата:
expression, return type, requirement
<code>, <code>T&</code>, <code>t</code> е еквивалентно со <code>u</code><code>T(t)</code>, n/a, <code>t</code> е еквивалентно со <code>T(t)</code><code>T(u)</code>, n/a, <code>u</code> е еквивалентно со <code>T(u)</code><code>&u</code>, <code>(const) T*</code>, ја означува адресата на <code>u</code><code>t.~T()</code>, n/a, n/a
Каде <code>T</code> е тип кој се користи да ја го забрза векторот, <code>t</code> е вредност на <code>T</code> и <code>u</code> е вредност на (можна константа) <code>T</code>.
За даден вектор сите елементи мора да припаѓаат на истиот тип. На пример, еден не може да сочува податоци од двете форми int и char внатре во истиот вектор. Векторите пружат стандарден сет на функции за пристапни елементи, додавање елементи на почетокот или крајот, бришење елементи и барање колку елементи се архивирани.
1.1 Поединечен пристап на елементите
До поединечни елементи од векторот може да се пристапи со помош на операциите прикажани во долната табела. Следејќи ги стандардните конвенции за C и C++, првиот елемент има индекс <code>0</code>, и последниот елемент има индекс <code>size() – 1.</code>
expression, return type, bounds checking?
<code>v.at(i)</code>, <code>T& </code>or <code>const T& </code>to the element at index <code>i</code>, yes, throws <code>out_of_range</code> exception
<code>v[i]</code>, <code>T& </code>or <code>const T& </code>to the element at index <code>i</code>, undefined behaviour if <code>i >= v.size()
<code>v.front()</code>, <code>T& </code>or <code>const T& </code>to the first element, undefined behaviour if <code>v.empty()</code> is <code>true</code><code>v.back()</code>, <code>T& </code>or <code>const T& </code>to the last element, undefined behaviour if <code>v.empty()</code> is <code>true</code>
Каде <code>v</code> е објект од типот (возможна константа) вектор <code><T></code> и го претставува индексот.
1.2 Преглед на функции
* Информативни
**<code>vector::front </code>– Го враќа повикот на првиот елемент на векторот.
**<code>vector::back </code>– Го враќа повикот на последниот елемент на векторот.
**<code>vector::size</code> – Го враќа бројот на елементи во векторот.
**<code>vector::empty</code> – Векторт нема елементи.
**<code>vector::capacity</code> – Го враќа моментниот капацитет на векторот.
* Стандардни операции
**<code>vector::insert</code> – Вметнува елементи во векторот, подоцна се преместуваат.
**<code>vector::push_back</code> – Додава елемент на крајот на некој вектор, доделува меморија ако е потребно.
**<code>vector::erase </code>– Ги бриши елементите од векторот, подоцна ги преместува долу.
**<code>vector::pop_back </code>– Ги бриши последните елементи на векторот. Обично не ја намалува меморијата на векторот.
**<code>vector::clear </code>– Ги бриши сите елементи.
* Промена на големината
**<code>vector::reserve</code> – Го променува капацитетот на векторот, ако е потребно.
**<code>vector::resize </code>– Ја променува големината на векторот.
* Повторување
**<code>vector::begin</code> – Го враќа итераторот на почетокот на векторот.
**<code>vector::end </code>– Го враќа итераторот на крајот на векторот.
1.3 Капацитет и доделување
Типичен вектор се состои од имплементација, внатрешно, на показник на динамички доделено поле, и можни податоци кои го држат капацитетот и големината на векторот. Големината на векторот се однесува на реалните броеви, додека капацитетот се однесува на големината на внатрешниот ред.
Бидејќи адресите на елементите се менуваат во текот на оваа постапка, сите повикувачи или итератори до елементите во векторот се поништуваат. Користејќи ги поништените наводи се предизвикува недефинирано однесување. На пример:
<code>reserve()</code> операцијата може да се користи за да се спречи непотребно делоцирање. После повикувањето на <code>reserve(n)</code>, капацитетот на векторот е гарантирано да биде најмалку <code>n</code>. На пример:
Векторот одржува редослед помеѓу неговите елементи. Со тоа се овозможува, кога нов елемент ќе се внеси на почетокот или на средината на векторот, сите елементи да се поместат наназад од деделениот елемент. Значи, повикувачите и итераторите до елементите зад точката на внесување стануваат невалидни. На пример:
== Употреба ==
C++ програма која содржи вектор мора да има: #include <vector>
Употребата на векторот е делкарирана со:
<source>
std::vector<T> instance;
каде <code>„T“</code> е врста на податок во вектор, а <code>„instance”</code> е името на променливата во вектор. <code>„T”</code> може да биде било која врста <code>Assignable</code>, вклучувајќи ги и корисничките дефинирани типови.
Алтернатива за чување објекти од типот <code>Т</code> е да се складираат објекти од типот <code>T*</code>. Тоа е корисно ако <code>Т</code> не е пренослив или е „прескапо” за копирање.
1.4 Замена на низа
Во C++, низите се допирни делови со меморијата. Тие се нешто како блокови меѓусебно сврзани. На секој блок тогаш му се доделува број. Сите елементи мора да бидат од ист тип.
Векторот е сличен на динамички доделено поле , али со можност за самостојна големина и без потреба за рачна делокација на меморијата.
Бидејќи векторските елементи се складирани , адресата од првиот елемент е вектор и може да се пренеси на функции очекувајќи низа (покажувач на првиот елемент). Следниот пример покажува како еден вектор може да се користи со стандардната библиотека на C.
Имајте на ум дека таквата употреба на memcpy и printf е општо обесхрабрен во корист на сигурносната алтернатива од типот од C++ Стандардната Библиотека.
1.5 Пример
Следниот пример покажува разни техники кои вклучуваат вектори и стандардната библиотека на C++.
При извршување на програмата добиваме:
''Најголемиот број е 8''''Сместен е на индекс 6''''Бројот 5 е сместен на индекс 4''''1234''
1.6 Одлики
* Векторите искористуваат мал дел од меморијата.
* Како и другите STL контејнери, векторите можат да содржат двата вида на податоци (првобитни и сложени) , кориснички дефинирани класи или структури.