Како се користи вектор Ц ++

How Use C Vector



Увод

Низ је низ истих типова објеката на узастопним меморијским локацијама. Низ не може повећати смањење руде по дужини. Вектор је попут низа, али се његова дужина може повећати или смањити. Вектор, дакле, има много више операција од низа.

Ц ++ има много библиотека, од којих све чине стандардну библиотеку Ц ++. Једна од ових библиотека је библиотека контејнера. Контејнер је збирка објеката, а одређене збирке се могу извести над збирком. Ц ++ контејнери се могу груписати у два скупа: контејнери за секвенце и асоцијативни контејнери. Контејнери секвенце су векторски, низ (није исти низ о којем смо раније говорили), декуе, форвард_лист и лист. То су различите збирке (структуре података налик низу), а свака нуди различите компромисе.







Сваки програмер би требао знати како одлучити хоће ли користити вектор, низ, декуе, форвард_лист или листу. Када програмер треба структуру која захтева више операција од оних повезаних са обичним низом, обичан низ се не би требао користити.



Ако задатак укључује често уметање и брисање у средини низа, тада би требало користити листу или форвард_лист. Ако задатак укључује често уметање и брисање на почетку или на крају низа, тада би требало користити декуе. Вектор треба користити када овакве операције нису потребне.



Овај чланак приказује како се користи вектор Ц ++. Да бисте разумели овај чланак, биће вам потребно знање о Ц ++ показивачима, референцама и низовима.





Класа и објекти

Класа је скуп променљивих и функција које раде заједно, где променљиве немају додељене вредности. Када су вредности додељене променљивим, класа постаје објекат. Различите вредности дате истој класи резултирају различитим објектима; односно различити објекти могу бити исте класе али имати различите вредности. Креирање објекта из класе је такође познато као инстанцирање објекта.

Израз вектор описује класу. Објекат креиран од вектора има име које бира програмер.



Функција која припада класи је потребна за инстанцирање објекта из класе. У Ц ++ та функција има исто име као и име класе. Различити објекти створени (настали) из класе имају различита имена која им је програмер дао.

Креирање објекта из класе значи конструисање објекта; то такође значи инстанцирање објекта.

Класа вектора

Векторска класа је већ дефинисана и налази се у библиотеци. Да би користио векторску класу, програмер мора укључити заглавље вектора у датотеку са следећом директивом о предпроцесирању:

#инцлуде

Када се заглавље укључи, све векторске карактеристике (чланови података и функције члана) постају доступне. Да бисте користили објекат цоунт за излаз података на терминал (конзолу), мора се укључити и заглавље објекта. Да бисте написали програм са вектором, морате да укључите следеће заглавља:

#инцлуде
#инцлуде

Инстантирање вектора

интфоо[10];

Горе је декларација низа са именом фоо и бројем елемената 10. Ово је низ целих бројева. Декларација вектора је слична. За вектор, број елемената је опционалан, јер се дужина вектора може повећати или смањити.

У овом тренутку програма, векторска класа је већ дефинисана у библиотеци, а заглавље је укључено. Вектор се може направити на следећи начин:

сати::вектор <инт>втр(8);

Овде је вектор посебне функције конструктора. Врста података које ће вектор држати је инт, у угластим заградама. Израз втр је назив који је програмер одабрао за вектор. Коначно, 8, у заградама, је оквирни број целих бројева које ће вектор имати.

Израз стд означава стандардни простор имена. У овом контексту овај израз мора бити праћен двоструким двотачком. Свако може написати своју библиотеку векторских класа и користити је. Међутим, Ц ++ већ има стандардну библиотеку са стандардним именима, укључујући векторске. Да бисте користили стандардно име, стандардном имену мора претходити стд ::. Да бисте избегли уписивање стд :: сваки пут у програм за стандардни назив, програмска датотека може започети на следећи начин:

#инцлуде
#инцлуде
користећи именски простор стд;

Преоптерећење функције

Када два или више потписа различитих функција имају исто име, каже се да је то име преоптерећено. Када се позове једна функција, број и врста аргумената одређују која ће се функција извршити.

Конструисање вектора

Конструисање вектора значи инстанцирање (креирање) векторског објекта. Конструкторска функција је преоптерећена на следећи начин:

векторско име

Ово ствара вектор нуле дужине и типа Т. Следећи исказ ствара вектор нулте дужине типа флоат са именом втр:

вектор<пловак>втр;

векторски назив (н)

Ово ствара вектор са н елемената типа Т. Изјава за овај вектор са четири плутајућа елемента је следећа:

вектор<пловак>втр(4);

векторски назив (н, т)

Ово ствара вектор од н елемената иницијализованих на вредност т. Следећа изјава ствара вектор од 5 елемената, при чему сваки елемент има вредност 3,4:

вектор<пловак>втр(5, 3.4);

Конструисање са иницијализацијом

Вектор се може конструисати (креирати) и иницијализовати истовремено, на један од следећа два начина:

вектор<пловак>втр= {1.1, 2.2, 3.3, 4.4};

Ор

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};

Имајте на уму да не постоје заграде одмах након назива објекта. Заграде које се користе одмах након назива објекта треба да имају листу иницијализатора, на следећи начин:

вектор<пловак>втр({1.1, 2.2, 3.3, 4.4});

Вектор се касније може конструисати и иницијализовати помоћу листе иницијализатора. У овом случају заграде се неће користити:

вектор<пловак>втр;
втр= {1.1, 2.2, 3.3, 4.4};

вектор В2 (В1)

Ово је конструктор копије. Он ствара вектор В2 као копију вектора В1. Следећи код то илуструје:

вектор<пловак>втр1(5, 3.4);
вектор<пловак>втр2(втр1);

Додељивање вектора током изградње

Током изградње може се створити празан вектор док му је додељен други, на следећи начин:

вектор<пловак>втр1{1.1, 2.2, 3.3, 4.4};
вектор<пловак>втр2=втр1;

Друга изјава је еквивалентна:

вектор<пловак>втр2= {1.1, 2.2, 3.3, 4.4};

цонст Вецтор

Цонст вектор је вектор чији се елементи не могу мењати. Вредности у овом вектору су само за читање. Када се створи, вектор се појављује на следећи начин:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};

У овом векторском типу ниједан елемент се не може додати или уклонити. Штавише, ниједна вредност се не може променити.

Конструкција са Итератором

Предложак пружа општи приказ за тип података. Итератор пружа општи приказ скенирања кроз вредности контејнера. Синтакса за креирање вектора са итератором је следећа:

шаблон<класа ИнпутИтератор>
вектор(ИнпутИтератор прво,ИнпутИтератор задњи,цонстАллоцатор& =Аллоцатор());

Ово конструише вектор за опсег [први, последњи] користећи наведени алокатор, о чему ће бити речи касније у овом чланку.

Уништавање вектора

Да бисте уништили вектор, једноставно дозволите да изађе из опсега и уништавање се рукује аутоматски.

Вецтор Цапацити

сизе_типе цапацити () цонст ноекцепт

Укупан број елемената које вектор може држати без потребе за прерасподјелом враћа функција капацитета капацитета. Кодни сегмент за ово је следећи:

вектор<пловак>втр(4);
интна једном=втр.капацитет();
цена<<на једном<< ' н';

Излаз је 4.

резерва (н)

Меморијски простор није увек слободно доступан. Додатни простор се може резервисати унапред. Размотрите следећи сегмент кода:

вектор<пловак>втр(4);
втр.резерва(6);
цена<<втр.капацитет() << ' н';

Излаз је 6. Дакле, додатни простор резервисан је 6 - 4 = 2 елемента. Функција враћа воид.

сизе () цонст ноекцепт

Ово враћа број елемената у вектору. Следећи код илуструје ову функцију:

вектор<пловак>втр(4);
пловакс=втр.величина();
цена<<с<< ' н';

Излаз је 4.

смањити да стане()

Након додавања већег капацитета вектору са функцијом Ресерве (), вектор се може смањити тако да одговара оригиналној величини. Следећи код то илуструје:

вектор<пловак>втр(4);
втр.резерва(6);
втр.смањити да стане();
интс=втр.величина();
цена<<с<< ' н';

Излаз је 4, а не 6. Функција враћа воид.

промени величину (сз), промени величину (сз, ц)

Ово мења величину вектора. Ако је нова величина мања од старе, тада се елементи према крају бришу. Ако је нова величина дужа, тада се на крају додаје нека задана вредност. Да бисте добили одређену додатну вредност, користите функцију ресизе () са два аргумента. Следећи сегмент кода илуструје употребу ове две функције:

вектор<пловак>втр1{1.1, 2.2, 3.3, 4.4};
втр1.промените величину(2);
цена<< 'Нова величина втр1:' <<втр1.величина() << ' н';
вектор<пловак>втр2{1.1, 2.2};
втр2.промените величину(4, 8.8);
цена<< 'втр2:'<<втр2[0] <<''<<втр2[1] <<'
'
<<втр2[2] <<''<<втр2[3] << ' н';

Излаз је следећи:

Нова величина втр1: 2
втр2: 1,1 2,2 8,8 8,8

Функције враћају воид.

емпти () цонст ноекцепт

Ова функција враћа 1 за труе ако нема елемената у вектору и 0 за фалсе ако је вектор празан. Ако вектор има 4 локације за одређену врсту података, као што је флоат, без икакве плутајуће вредности, онда тај вектор није празан. Следећи код то илуструје:

вектор<пловак>втр;
цена<<втр.празна() << ' н';
вектор<пловак>вт(4);
цена<<тако дапразна() << ' н';

вектор<пловак>в(4,3.5);
цена<<в.празна() << ' н';

Излаз је следећи:

1
0
0

Приступ векторским елементима

Вектор може бити скриптован (индексиран) попут низа. Бројање индекса почиње од нуле.

вецторНаме [и]

Операција вецторНаме [и] враћа референцу на елемент на итхиндекс вектора. Следећи код даје 3.3 за горњи вектор:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
пловакфл=втр[2];
цена<<фл<< ' н';

вецторНаме [и] цонст

Операција вецторНаме [и] цонст се извршава уместо вецторНаме [и] када је вектор константан вектор. Ова операција се користи у следећем коду:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
пловакфл=втр[2];
цена<<фл<< ' н';

Израз враћа сталну референцу на итхелемент вектора.

Додела вредности помоћу Субсцрипта

Вредност се може доделити весту који није константан, на следећи начин:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
втр[2] = 8.8;
цена<<втр[2] << ' н';

Излаз је 8,8.

вецторНаме.ат (и)

вецторНаме.ат (и) је попут вецторНаме [и], али вецторНаме.ат (и) је поузданији. Следећи код показује како би требало користити овај вектор:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
пловакфл=втр.ат(2);
цена<<фл<< ' н';
ат()је члан векторафункција.

вецторНаме.ат (и) цонст

вецторНаме.ат (и) цонст је попут вецторНаме [и] цонст, али вецторНаме.ат (и) цонст је поузданији. вецторНаме.ат (и) цонст се извршава уместо вецторНаме.ат (и) када је вектор константан вектор. Овај вектор се користи у следећем коду:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
пловакфл=втр.ат(2);
цена<<фл<< ' н';
ат() цонстје члан векторафункција.

Додељивање вредности помоћу функције ат ()

Вредност се може доделити неконстантном вектору са функцијом ат (), на следећи начин:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
втр.ат(2) = 8.8;
цена<<втр[2] << ' н';

Излаз је 8,8.

Проблем са под-скриптама

Проблем са под скриптирањем (индексирањем) је то што ако је индекс изван опсега, може се вратити нула или се може појавити грешка током извођења.

фронт ()

Ово враћа референцу на први елемент вектора без уклањања елемента. Излаз следећег кода је 1.1.

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
пловакфл=втр.фронт();
цена<<фл<< ' н';

Елемент није уклоњен из вектора.

фронт () цонст

Када векторској конструкцији претходи цонст, уместо фронт () се изводи израз фронт () цонст. Ово се користи у следећем коду:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
пловакфл=втр.фронт();
цена<<фл<< ' н';

Враћа се константна референца. Елемент није уклоњен из вектора.

назад()

Ово враћа референцу на последњи елемент вектора без уклањања елемента. Излаз следећег кода је 4.4.

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
пловакфл=втр.назад();
цена<<фл<< ' н';

бацк () цонст

Када векторској конструкцији претходи цонст, уместо бацк () се извршава израз бацк () цонст. Ово се користи у следећем коду:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
пловакфл=втр.назад();
цена<<фл<< ' н';

Враћа се константна референца. Елемент није уклоњен из вектора.

Векторски приступ подацима

дата () ноекцепт; дата () цонст ноекцепт;

Било који од ових враћа показивач тако да је [дата (), дата () + сизе ()) важећи опсег.

Ово ће бити детаљније обрађено касније у чланку.

Враћање итератора и вектора

Итератор је попут показивача, али има више функција од показивача.

бегин () ноекцепт

Враћа итератор који показује на први елемент вектора, као у следећем сегменту кода:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
вектор<пловак> ::итераторитер=втр.започети();
цена<< *итер<< ' н';

Излаз је 1,1. Имајте на уму да је декларација која прима итератор декларисана. Итератор се дереференцира у повратном изразу да би добио вредност на исти начин на који се показивач дереференцира.

бегин () цонст ноекцепт;

Враћа итератор који показује на први елемент вектора. Када векторској конструкцији претходи цонст, израз бегин () цонст се извршава уместо бегин (). Под овим условом, одговарајући елемент у вектору се не може изменити. Ово се користи у следећем коду:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
вектор<пловак> ::цонст_итераторитер=втр.започети();
цена<< *итер<< ' н';

Излаз је 1,1. Имајте на уму да је цонст_итератор овај пут коришћен уместо само итератора за пријем враћеног итератора.

енд () ноекцепт

Враћа итератор који показује непосредно иза последњег елемента вектора. Размотрите следећи сегмент кода:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
вектор<пловак> ::итераторитер=втр.крај();
цена<< *итер<< ' н';

Излаз је 0, што је бесмислено, јер нема конкретног елемента осим задњег елемента.

енд () цонст ноекцепт

Враћа итератор који показује непосредно иза последњег елемента вектора. Када векторској конструкцији претходи цонст, уместо енд () се изводи израз енд () цонст. Размотрите следећи сегмент кода:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
вектор<пловак> ::цонст_итераторитер=втр.крај();
цена<< *итер<< ' н';

Излаз је 0. Имајте на уму да је овај пут цонст_итератор кориштен умјесто само итератора за примање враћеног итератора.

Реверсе Итератион

Могуће је имати итератор који понавља од краја до непосредно пре првог елемента.

рбегин () ноекцепт

Враћа итератор који показује на последњи елемент вектора, као у следећем сегменту кода:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
вектор<пловак> ::реверсе_итераторрИтер=втр.рбегин();
цена<< *рИтер<< ' н';

Излаз је 4,4.

Имајте на уму да је декларација која прима обрнути итератор декларисана. Итератор се дереференцира у повратном изразу да би добио вредност на исти начин на који се показивач дереференцира.

рбегин () цонст ноекцепт;

Враћа итератор који показује на последњи елемент вектора. Када векторској конструкцији претходи цонст, уместо рбегин () се извршава израз рбегин () цонст. Под овим условом, одговарајући елемент у вектору се не може изменити. Ова функција се користи у следећем коду:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
вектор<пловак> ::цонст_реверсе_итераторрИтер=втр.рбегин();
цена<< *рИтер<< ' н';

Излаз је 4,4.

Имајте на уму да је цонст_реверсе_итератор овај пут коришћен, уместо само реверсе_итератор, за пријем враћеног итератора.

рендер () ноекцепт

Враћа итератор који показује непосредно пре првог елемента вектора. Размотрите следећи сегмент кода:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
вектор<пловак> ::реверсе_итераторрИтер=втр.чини();
цена<< *рИтер<< ' н';

Излаз је 0, што је бесмислено, јер не постоји конкретан елемент непосредно прије првог елемента.

рендер () цонст ноекцепт

Враћа итератор који показује непосредно пре првог елемента вектора. Када векторској конструкцији претходи цонст, уместо ренд () се извршава израз ренд () цонст. Размотрите следећи сегмент кода:

цонствектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
вектор<пловак> ::цонст_реверсе_итераторрИтер=втр.чини();
цена<< *рИтер<< ' н';

Излаз је 0.

Имајте на уму да је цонст_реверсе_итератор овај пут коришћен, уместо само реверсе_итератор, за пријем враћеног итератора.

Вецтор Модифиерс

Модификатор који модификује вектор може узети или вратити итератор.

а.мплаце (п, аргс)

Убацује објекат типа Т конструисан са стд :: форвард (аргс) ... пре п.

За детаље - погледајте касније

инсерт (итераторПоситион, валуе)

Убацује копију вредности на позицију итератора вектора. Враћа итератор (позицију) у вектору где је копија постављена. Следећи код приказује где је вредност постављена:

вектор<инт>втр{10, двадесет, 30, 40};
вектор<инт> ::итераторитер=втр.започети();
++итер;
++итер;
втр.уметнути(итер, 25);
цена<<втр[1] << '' <<втр[2]<< '
'
<<втр[3] << ' н';

Излаз је: 20 25 30.

Имајте на уму да је итератор био напредан (повећан) баш као и показивач.

Такође се може уметнути листа иницијализатора, као што приказује следећи код:

вектор<инт>втр{10, двадесет, 30, 40};
вектор<инт> ::итераторитер=втр.започети();
++итер;
++итер;
втр.уметнути(итер, {25, 28});

цена<<втр[1] << '' <<втр[2]<< '
'
<<втр[3]<< '' <<втр[4] << ' н';

Излаз је: 20 25 28 30.

брисање (положај)

Уклања елемент на позицији на коју показује итератор, а затим враћа позицију итератора. Следећи код то илуструје:

вектор<инт>втр{10, двадесет, 30, 40};
вектор<инт> ::итераторитер=втр.започети();
++итер;
++итер;
втр.избрисати(итер);
цена<<втр[0] << '' <<втр[1] << '
'
<<втр[2]<< ' н';

Излаз је: 10 20 40

пусх_бацк (т), пусх_бацк (рв)

Користи се за додавање једног елемента на крају вектора. Користите пусх_бацк (т) на следећи начин:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
втр.потисне(5.5);
пловакфл=втр[4];
цена<<фл<< ' н';

Излаз је 5,5.

потисне(рв): -Видимо се касније.

поп_бацк ()

Уклања последњи елемент без враћања. Величина вектора се смањује за 1. Следећи код то илуструје:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
втр.поп_бацк();
пловакс=втр.величина();
цена<<с<< ' н';

Излаз је 3.

а.свап (б)

Два вектора се могу заменити, као што је илустровано у следећем сегменту кода:

вектор<пловак>втр1{1.1, 2.2, 3.3, 4.4};
вектор<пловак>втр2{10, двадесет};
втр1.свап(втр2);
цена<< 'втр1:'<<втр1[0] <<''<<втр1[1] <<'
'
<<втр1[2] <<''<<втр1[3] << ' н';

цена<< 'втр2:'<<втр2[0] <<''<<втр2[1] <<'
'
<<втр2[2] <<''<<втр2[3] << ' н';

Излаз је:

втр1: 10 двадесет 0 0
втр2: 1.1 2.2 3.3 4.4

Имајте на уму да се дужина вектора повећава, ако је потребно. Такође, вредности које нису имале замене замењују се неком подразумеваном вредношћу.

јасно()

Уклања све елементе из вектора, као што приказује следећи сегмент кода:

вектор<пловак>втр{1.1, 2.2, 3.3, 4.4};
втр.јасно();
цена<<втр.величина() << ' н';

Излаз је 0.

Оператори једнакости и релације за векторе

Оператер ==

Враћа 1 за труе ако два вектора имају исту величину и одговарајући елементи су једнаки; у супротном, враћа 0 за фалсе. На пример:

вектор<инт>У{1, 2, 3};
вектор<инт>В.{4, 5, 6};
боол бл=У==В.;
цена<<бл<< ' н';

Излаз је 0.

! = Оператор

Враћа 1 за труе ако два вектора немају исту величину и/или одговарајући елементи нису једнаки; у супротном, враћа 0 за фалсе. На пример:

вектор<инт>У{1, 2, 3};
вектор<инт>В.{4, 5, 6};
боол бл=У! =В.;
цена<<бл<< ' н';

Излаз је 1.

Тхе

Враћа 1 за труе ако је први вектор почетни подскуп другог вектора, при чему су елементи два једнака дела исти и у истом редоследу. Ако су оба вектора исте величине и крећу се слева надесно, а у првом вектору наиђе на елемент који је мањи од одговарајућег елемента у другом вектору, тада ће 1 бити враћен. У супротном се враћа 0 за фалсе. На пример:

вектор<инт>У{3, 1, 1};
вектор<инт>В.{3, 2, 1};
боол бл=У<В.;
цена<<бл<< ' н';

Излаз је 1.

> Оператор

Враћа се! (У

Тхе<= Operator

Враћа У<= V, where U is the first vector and V is the second vector, according to the above definitions.

Оператор> =

Враћа се! (У<= V), where U is the first vector and V is the second vector, according to the above definitions.

Закључак

Вектор је пример контејнера секвенце. Вектор је бољи облик обичног низа и покреће се из класе. Вектори имају методе које су класификоване према: конструкција и додељивање, капацитет, приступ елементима, приступ подацима, итератори, модификатори и нумерички преоптерећени оператори.

Постоје и други контејнери секвенце, који се називају листа, листа напред_лист и низ. Ако задатак укључује често уметање и брисање у средини низа, тада би требало користити листу или форвард_лист. Ако задатак укључује често уметање и брисање на почетку или на крају низа, тада би требало користити декуе. Дакле, векторе треба користити само када овакве операције нису важне.