Ц ++

Како се користи Ц ++ Вецтор

Како се користи Ц ++ Вецтор

Увод

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

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

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

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

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

Класа и предмети

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

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

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

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

Векторска класа

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

#инцлуде

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

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

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

инт фоо [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);
инт нум = втр.капацитет ();
цоут << num << '\n';

Излаз је 4.

резерва (н)

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

вектор втр (4);
втр.резерва (6);
цоут << vtr.capacity() << '\n';

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

величина () цонст ноекцепт

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

вектор втр (4);
флоат сз = втр.величина ();
цоут << sz << '\n';

Излаз је 4.

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

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

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

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

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

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

вектор втр1 1.1, 2.2, 3.3, 4.4;
втр1.променити величину (2);
цоут << "New size of vtr1: " << vtr1.size() << '\n';
вектор втр2 1.1, 2.2;
втр2.променити величину (4, 8.8);
цоут << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';

Резултат је следећи:

Нова величина втр1: 2
втр2: 1.1 2.2 8.8 8.8

Функције се враћају ништавне.

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

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

вектор втр;
цоут << vtr.empty() << '\n';
вектор вт (4);
цоут << vt.empty() << '\n';
вектор в (4,3.5);
цоут << v.empty() << '\n';

Резултат је следећи:

1
0
0

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

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

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

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

вектор втр 1.1, 2.2, 3.3, 4.4;
флоат фл = втр [2];
цоут << fl << '\n';

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

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

цонст вектор втр 1.1, 2.2, 3.3, 4.4;
флоат фл = втр [2];
цоут << fl << '\n';

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

Додељивање вредности са индексом

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

вектор втр 1.1, 2.2, 3.3, 4.4;
втр [2] = 8.8;
цоут << vtr[2] << '\n';

Излаз је 8.8.

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

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

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

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

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

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

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

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

вектор втр 1.1, 2.2, 3.3, 4.4;
втр.при (2) = 8.8;
цоут << vtr[2] << '\n';

Излаз је 8.8.

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

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

предњи ()

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

вектор втр 1.1, 2.2, 3.3, 4.4;
флоат фл = втр.фронт ();
цоут << fl << '\n';

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

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

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

цонст вектор втр 1.1, 2.2, 3.3, 4.4;
флоат фл = втр.фронт ();
цоут << fl << '\n';

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

назад()

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

вектор втр 1.1, 2.2, 3.3, 4.4;
флоат фл = втр.назад();
цоут << fl << '\n';

бацк () цонст

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

цонст вектор втр 1.1, 2.2, 3.3, 4.4;
флоат фл = втр.назад();
цоут << fl << '\n';

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

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

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

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

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

Повратак итератора и вектора

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

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

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

вектор втр 1.1, 2.2, 3.3, 4.4;
вектор:: итератор итер = втр.почети();
цоут << *iter << '\n';

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

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

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

цонст вектор втр 1.1, 2.2, 3.3, 4.4;
вектор:: цонст_итератор итер = втр.почети();
цоут << *iter << '\n';

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

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

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

вектор втр 1.1, 2.2, 3.3, 4.4;
вектор:: итератор итер = втр.крај();
цоут << *iter << '\n';

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

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

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

цонст вектор втр 1.1, 2.2, 3.3, 4.4;
вектор:: цонст_итератор итер = втр.крај();
цоут << *iter << '\n';

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

Обрнута итерација

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

рбегин () без изузетка

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

вектор втр 1.1, 2.2, 3.3, 4.4;
вектор:: реверсе_итератор рИтер = втр.рбегин ();
цоут << *rIter << '\n';

Излаз је 4.4.

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

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

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

цонст вектор втр 1.1, 2.2, 3.3, 4.4;
вектор:: цонст_реверсе_итератор рИтер = втр.рбегин ();
цоут << *rIter << '\n';

Излаз је 4.4.

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

ренд () без изузетка

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

вектор втр 1.1, 2.2, 3.3, 4.4;
вектор:: реверсе_итератор рИтер = втр.ренд ();
цоут << *rIter << '\n';

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

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

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

цонст вектор втр 1.1, 2.2, 3.3, 4.4;
вектор:: цонст_реверсе_итератор рИтер = втр.ренд ();
цоут << *rIter << '\n';

Излаз је 0.

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

Векторски модификатори

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

а.емплаце (п, аргументи)

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

За детаље - видети касније

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

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

вектор втр 10, 20, 30, 40;
вектор:: итератор итер = втр.почети();
++итер;
++итер;
втр.уметак (итер, 25);
цоут << vtr[1] << " << vtr[2]<< '
' << vtr[3] << '\n';

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

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

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

вектор втр 10, 20, 30, 40;
вектор:: итератор итер = втр.почети();
++итер;
++итер;
втр.инсерт (итер, 25, 28);
цоут << vtr[1] << " << vtr[2]<< '
' << vtr[3]<< " << vtr[4] << '\n';

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

избриши (положај)

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

вектор втр 10, 20, 30, 40;
вектор:: итератор итер = втр.почети();
++итер;
++итер;
втр.обрисати (итер);
цоут << vtr[0] << " << vtr[1] << '
' << vtr[2]<< '\n';

Излаз је: 10 20 40

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

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

вектор втр 1.1, 2.2, 3.3, 4.4;
втр.пусх_бацк (5.5);
флоат фл = втр [4];
цоут << fl << '\n';

Излаз је 5.5.

пусх_бацк (рв): - видети касније.

поп_бацк ()

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

вектор втр 1.1, 2.2, 3.3, 4.4;
втр.поп_бацк ();
флоат сз = втр.величина ();
цоут << sz << '\n';

Излаз је 3.

а.свап (б)

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

вектор втр1 1.1, 2.2, 3.3, 4.4;
вектор втр2 10, 20;
втр1.свап (втр2);
цоут << "vtr1: "<< vtr1[0] <<" "<< vtr1[1] <<"
"<< vtr1[2] <<" "<< vtr1[3] << '\n';
цоут << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';

Излаз је:

втр1: 10 20 0 0
втр2: 1.1 2.2 3.3 4.4

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

јасно()

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

вектор втр 1.1, 2.2, 3.3, 4.4;
втр.јасно();
цоут << vtr.size() << '\n';

Излаз је 0.

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

Оператор ==

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

вектор У 1, 2, 3;
вектор В 4, 5, 6;
боол бл = У == В;
цоут << bl << '\n';

Излаз је 0.

Тхе != Оператор

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

вектор У 1, 2, 3;
вектор В 4, 5, 6;
боол бл = У!= В;
цоут << bl << '\n';

Излаз је 1.

Тхе < Operator

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

вектор У 3, 1, 1;
вектор В 3, 2, 1;
боол бл = Уцоут << bl << '\n';

Излаз је 1. < does not include the case when the size and order are the same.

> Оператор

Повратак !(У < V), where U is the first vector and V is the second vector, according to the above definitions.

Тхе <= 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.

Закључак

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

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

Најбољи Линук Дистрос за игре у 2021
Линук оперативни систем далеко је превалио свој изворни, једноставни изглед заснован на серверима. Овај ОС се изузетно побољшао последњих година и сад...
Како снимити и стримовати своју играћу сесију на Линук-у
У прошлости се играње игара сматрало само хобијем, али с временом је играчка индустрија забележила огроман раст у погледу технологије и броја играча. ...
Најбоље игре за ручно праћење
Оцулус Куест је недавно представио сјајну идеју ручног праћења без контролера. Са све већим бројем игара и активности које извршавају подршку формално...