Увод
Низ је низ истих типова објеката на узастопним меморијским локацијама. Низ не може да повећа или смањи дужину руде. Вектор је попут низа, али се његова дужина може повећати или смањити. Вектор, према томе, има много више операција него низ.
Ц ++ има много библиотека, које све чине Ц ++ стандардну библиотеку. Једна од ових библиотека је библиотека контејнера. Контејнер је колекција предмета и на колекцији се могу изводити одређене радње. Ц ++ контејнери могу се груписати у два сета: контејнери за секвенце и асоцијативни контејнери. Контејнери за секвенце су вектор, низ (није исти низ о коме смо претходно говорили), декуе, форвард_лист и лист. То су различите колекције (структуре података сличне низу) и свака нуди различите компромисе.
Сваки програмер треба да зна како да одлучи да ли ће користити вектор, низ, декуе, форвард_лист или листу. Када програмеру треба структура која захтева више операција од оних повезаних са обичним низом, обични низ не би требало користити.
Ако задатак укључује честа уметања и брисања у средини низа, тада треба користити списак или прослеђени_лист. Ако задатак укључује честа уметања и брисања на почетку или на крају низа, онда треба користити декуе. Вектор треба користити када ове врсте операција нису потребне.
Овај чланак вам показује како се користи вектор Ц ++. Требаће вам неко знање о Ц ++ показивачима, референцама и низовима да бисте разумели овај чланак.
Класа и предмети
Класа је скуп променљивих и функција које раде заједно, где променљиве немају додељене вредности. Када су вредности додељене променљивим, класа постаје објект. Различите вредности дате истој класи резултирају различитим објектима; односно различити објекти могу бити исте класе, али имају различите вредности. Креирање објекта из класе познато је и као инстанцирање објекта.
Појам вектор описује класу. Објект створен од вектора има име које бира програмер.
Функција која припада класи је потребна за инстанцирање објекта из класе. У Ц ++, та функција има исто име као и назив класе. Различити објекти створени (инстанцирани) из класе имају различита имена која је програмер доделио сваком од њих.
Стварање објекта из класе значи конструисање објекта; то такође значи инстанцирање објекта.
Векторска класа
Векторска класа је већ дефинисана и налази се у библиотеци. Да би користио векторску класу, програмер мора да укључи заглавље вектора у датотеку са следећом директивом за предобраду:
#инцлудеЈедном када је заглавље укључено, све векторске функције (чланови података и функције чланова) постају доступне. Да бисте користили објект цоунт за излаз података на терминал (конзолу), заглавље објекта такође мора бити укључено. Да бисте написали програм са вектором, морају се укључити најмање следећа заглавља:
#инцлуде#инцлуде
Инстанцирање вектора
инт фоо [10];Изнад је декларација низа са именом „фоо“ и бројем елемената „10.”Ово је низ целих бројева. Декларација вектора је слична. За вектор, број елемената није обавезан, јер се дужина вектора може повећавати или смањивати.
У овом тренутку у програму, векторска класа је већ дефинисана у библиотеци и заглавље је укључено. Инсталирање вектора може се извршити на следећи начин:
стд :: векторОвде је вектор посебне функције конструктора. Тип података који ће вектор држати је „инт“, у угластим заградама. Израз „втр“ је назив који је програмер изабрао за вектор. Коначно, „8“, у заградама, је оквирни број целих бројева које ће вектор имати.
Израз „стд“ означава стандардни простор имена. У овом контексту овај израз мора бити праћен двоструким двотачком. Свако може написати сопствену библиотеку класа вектора и користити је. Међутим, Ц ++ већ има стандардну библиотеку са стандардним именима, укључујући „вектор.”Да бисте користили стандардно име, пред стандардним именом мора бити стд :: . Да не бисте куцали стд :: сваки пут у програму за стандардно име, програмска датотека може започети на следећи начин:
#инцлуде#инцлуде
коришћење простора имена стд;
Преоптерећење функције
Када два или више различитих потписа функције имају исто име, каже се да је то име преоптерећено. Када се позове једна функција, број и врста аргумената одређују која ће се функција извршити.
Конструисање вектора
Конструисање вектора значи инстанцирање (стварање) векторског објекта. Функција конструктора је преоптерећена на следећи начин:
вектор
Ово ствара вектор дужине нула и укуцајте „Т.”Следећа изјава креира вектор нулте дужине типа„ флоат ”са именом„ втр: ”
векторвектор
Ово ствара вектор са н елемената типа „Т.”Изјава за овај вектор са четири флоат елемента је следећа:
векторвектор
Ово ствара вектор од н елемената иницијализованих на вредност т. Следећа изјава креира вектор од 5 елемената, при чему сваки елемент има вредност 3.4:
векторКонструисање са иницијализацијом
Вектор се може конструисати (креирати) и истовремено покренути на један од следећа два начина:
векторИли
векторИмајте на уму да нема заграда непосредно иза имена објекта. Заграде које се користе непосредно након имена објекта требале би да имају листу иницијализатора, како следи:
векторВектор се може конструисати и иницијализовати касније помоћу листе иницијализатора. У овом случају, заграде се неће користити:
векторвтр = 1.1, 2.2, 3.3, 4.4;
вектор
Ово је конструктор копија. Ствара вектор В2 као копију вектора В1. Следећи код то илуструје:
векторвектор
Додељивање вектора током изградње
Током изградње може се створити празан вектор док му се додељује други, како следи:
векторвектор
Друга изјава је еквивалентна:
векторцонст Вецтор
Цонст вектор је вектор чији се елементи не могу мењати. Вредности у овом вектору су само за читање. Када се креира, вектор се појављује на следећи начин:
цонст векторУ овом векторском типу ниједан елемент не може бити додан или уклоњен. Штавише, ниједна вредност се не може променити.
Конструисање помоћу Итератора
Предложак пружа генерички приказ за тип података. Итератор пружа генерички приказ скенирања кроз вредности контејнера. Синтакса за стварање вектора с итератором је следећа:
шаблонвектор (први ИнпутИтератор, последњи ИнпутИтератор, цонст Аллоцатор & = Аллоцатор ());
Ово конструише вектор за опсег [први, последњи) помоћу наведеног алокатора, о чему ће бити речи касније у овом чланку.
Уништавање вектора
Да бисте уништили вектор, једноставно му дозволите да изађе из опсега и уништавање се обрађује аутоматски.
Капацитет вектора
сизе_типе капацитет () цонст ноекцепт
Укупан број елемената које вектор може садржати без потребе за прерасподјелом враћа функција функције капацитета. Сегмент кода за ово је следећи:
векторинт нум = втр.капацитет ();
цоут << num << '\n';
Излаз је 4.
резерва (н)
Простор меморије није увек слободно доступан. Додатни простор се може резервисати унапред. Размотрите следећи сегмент кода:
векторвтр.резерва (6);
цоут << vtr.capacity() << '\n';
Излаз је 6. Дакле, додатни резервисани простор је 6 - 4 = 2 елемента. Функција враћа воид.
величина () цонст ноекцепт
Ово враћа број елемената у вектору. Следећи код илуструје ову функцију:
векторфлоат сз = втр.величина ();
цоут << sz << '\n';
Излаз је 4.
смањити да стане()
Након давања додатног капацитета вектору помоћу функције ресерве (), вектор се може умањити тако да одговара својој првобитној величини. Следећи код то илуструје:
векторвтр.резерва (6);
втр.смањити да стане();
инт сз = втр.величина ();
цоут << sz << '\n';
Излаз је 4, а не 6. Функција враћа воид.
променити величину (сз), променити величину (сз, ц)
Ово мења величину вектора. Ако је нова величина мања од старе, елементи се према крају бришу. Ако је нова величина дужа, тада се пред крај додаје нека подразумевана вредност. Да бисте добили одређену вредност, користите функцију ресизе () са два аргумента. Следећи сегмент кода илуструје употребу ове две функције:
векторвтр1.променити величину (2);
цоут << "New size of vtr1: " << vtr1.size() << '\n';
вектор
втр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';
вектор
цоут << vt.empty() << '\n';
вектор
цоут << v.empty() << '\n';
Резултат је следећи:
10
0
Приступ векторским елементима
Вектор се може поткриптирати (индексирати) попут низа. Бројање индекса почиње од нуле.
вецторНаме [и]
Операција „вецторНаме [и]“ враћа референцу на елемент на итх индекс вектора. Следећи излази кода 3.3 за горњи вектор:
векторфлоат фл = втр [2];
цоут << fl << '\n';
вецторНаме [и] цонст
Операција „вецторНаме [и] цонст“ извршава се уместо „вецторНаме [и]“ када је вектор константан вектор. Ова операција се користи у следећем коду:
цонст векторфлоат фл = втр [2];
цоут << fl << '\n';
Израз враћа константну референцу на итх елемент вектора.
Додељивање вредности са индексом
Вредност се може доделити несталном вектору, како следи:
векторвтр [2] = 8.8;
цоут << vtr[2] << '\n';
Излаз је 8.8.
вецторНаме.у (и)
“ВецторНаме.ат (и) “је попут„ вецторНаме [и] “, али„ вецторНаме.ат (и) “је поузданији. Следећи код показује како треба користити овај вектор:
векторфлоат фл = втр.у (2);
цоут << fl << '\n';
ат () је векторска функција члана.
вецторНаме.на (и) цонст
“ВецторНаме.ат (и) цонст “је попут„ вецторНаме [и] цонст “, али„ вецторНаме.ат (и) цонст “је поузданији. “ВецторНаме.ат (и) цонст “извршава се уместо„ вецторНаме.на (и) “када је вектор константан вектор. Овај вектор се користи у следећем коду:
цонст векторфлоат фл = втр.у (2);
цоут << fl << '\n';
ат () цонст је векторска функција члана.
Додељивање вредности функцијом ат ()
Вредност се може доделити несталном вектору помоћу функције ат (), како следи:
векторвтр.при (2) = 8.8;
цоут << vtr[2] << '\n';
Излаз је 8.8.
Проблем са поткриптирањем
Проблем са поткриптирањем (индексирањем) је у томе што ако индекс није у домету, нула се може вратити или се при извођењу може појавити грешка.
предњи ()
Ово враћа референцу на први елемент вектора без уклањања елемента. Резултат следећег кода је 1.1.
векторфлоат фл = втр.фронт ();
цоут << fl << '\n';
Елемент се не уклања из вектора.
фронт () цонст
Када векторској конструкцији претходи цонст, израз „фронт () цонст“ се извршава уместо „фронт ().”Ово се користи у следећем коду:
цонст векторфлоат фл = втр.фронт ();
цоут << fl << '\n';
Враћа се константна референца. Елемент се не уклања из вектора.
назад()
Ово враћа референцу на последњи елемент вектора без уклањања елемента. Резултат следећег кода је 4.4.
векторфлоат фл = втр.назад();
цоут << fl << '\n';
бацк () цонст
Када векторској конструкцији претходи цонст, извршава се израз „бацк () цонст“ уместо „бацк ().”Ово се користи у следећем коду:
цонст векторфлоат фл = втр.назад();
цоут << fl << '\n';
Враћа се константна референца. Елемент се не уклања из вектора.
Векторски приступ подацима
дата () ноекцепт; дата () цонст ноекцепт;
Било који од ових враћа показивач такав да је [дата (), дата () + сизе ()) важећи опсег.
Ово ће бити детаљније обрађено касније у чланку.
Повратак итератора и вектора
Итератор је попут показивача, али има више функционалности од показивача.
бегин () ноекцепт
Враћа итератор који показује на први елемент вектора, као у следећем сегменту кода:
векторвектор
цоут << *iter << '\n';
Излаз је 1.1. Имајте на уму да је декларација која прима итератор декларисана. Итератор се дереференцира у повратном изразу да би се добила вредност на исти начин на који се дереференцира показивач.
бегин () цонст ноекцепт;
Враћа итератор који показује на први елемент вектора. Када је векторској конструкцији претходило цонст, уместо „бегин () извршава се израз„ бегин () цонст “.”Под овим условом, одговарајући елемент у вектору не може се изменити. Ово се користи у следећем коду:
цонст векторвектор
цоут << *iter << '\n';
Излаз је 1.1. Имајте на уму да је овај пут коришћен „цонст_итератор“ уместо само „итератор“ за примање враћеног итератора.
енд () ноекцепт
Враћа итератор који показује одмах иза последњег елемента вектора. Размотрите следећи сегмент кода:
векторвектор
цоут << *iter << '\n';
Излаз је 0, што је бесмислено, јер нема конкретног елемента изван последњег елемента.
енд () цонст ноекцепт
Враћа итератор који показује одмах иза последњег елемента вектора. Када векторској конструкцији претходи „цонст“, уместо „енд () извршава се израз„ енд () цонст “.”Размотрите следећи сегмент кода:
цонст векторвектор
цоут << *iter << '\n';
Излаз је 0. Имајте на уму да је овај пут коришћен „цонст_итератор“ уместо само „итератор“ за примање враћеног итератора.
Обрнута итерација
Могуће је имати итератор који се понавља од краја до непосредно пре првог елемента.
рбегин () без изузетка
Враћа итератор који показује на последњи елемент вектора, као у следећем сегменту кода:
векторвектор
цоут << *rIter << '\n';
Излаз је 4.4.
Имајте на уму да је декларација која прима обрнути итератор декларисана. Итератор се дереференцира у повратном изразу да би се добила вредност на исти начин на који се дереференцира показивач.
рбегин () цонст ноекцепт;
Враћа итератор који показује на последњи елемент вектора. Када је векторској конструкцији претходи „цонст“, уместо „рбегин () извршава се израз„ рбегин () цонст “).”Под овим условом, одговарајући елемент у вектору не може се изменити. Ова карактеристика се користи у следећем коду:
цонст векторвектор
цоут << *rIter << '\n';
Излаз је 4.4.
Имајте на уму да је овај пут кориштен цонст_реверсе_итератор, уместо само реверсе_итератор, за примање враћеног итератора.
ренд () без изузетка
Враћа итератор који показује непосредно пре првог елемента вектора. Размотрите следећи сегмент кода:
векторвектор
цоут << *rIter << '\n';
Излаз је 0, што је бесмислено, јер нема конкретног елемента непосредно пре првог елемента.
ренд () цонст ноекцепт
Враћа итератор који показује непосредно пре првог елемента вектора. Када је векторској конструкцији претходило „цонст“, уместо „ренд () извршава се израз„ ренд () цонст “).”Размотрите следећи сегмент кода:
цонст векторвектор
цоут << *rIter << '\n';
Излаз је 0.
Имајте на уму да је овај пут коришћен цонст_реверсе_итератор, уместо само реверсе_итератор, за примање враћеног итератора.
Векторски модификатори
Модификатор који модификује вектор може узети или вратити итератор.
а.емплаце (п, аргументи)
Убацује објекат типа Т конструисан са стд :: форвард
инсерт (итераторПоситион, вредност)
Убацује копију вредности на позицију итератора вектора. Враћа итератор (позицију) у вектору где је постављена копија. Следећи код показује где је постављена вредност:
векторвектор
++итер;
++итер;
втр.уметак (итер, 25);
цоут << vtr[1] << " << vtr[2]<< '
' << vtr[3] << '\n';
Излаз је: 20 25 30.
Имајте на уму да је итератор био напредан (увећан) баш као показивач.
Такође се може убацити листа иницијализатора, као што илуструје следећи код:
векторвектор
++итер;
++итер;
втр.инсерт (итер, 25, 28);
цоут << vtr[1] << " << vtr[2]<< '
' << vtr[3]<< " << vtr[4] << '\n';
Излаз је: 20 25 28 30.
избриши (положај)
Уклања елемент на положају на који указује итератор, а затим враћа положај итератора. Следећи код то илуструје:
векторвектор
++итер;
++итер;
втр.обрисати (итер);
цоут << vtr[0] << " << vtr[1] << '
' << vtr[2]<< '\n';
Излаз је: 10 20 40
пусх_бацк (т), пусх_бацк (рв)
Користи се за додавање једног елемента на крају вектора. Користите пусх_бацк (т) на следећи начин:
векторвтр.пусх_бацк (5.5);
флоат фл = втр [4];
цоут << fl << '\n';
Излаз је 5.5.
пусх_бацк (рв): - видети касније.поп_бацк ()
Уклања последњи елемент без враћања. Величина вектора је смањена за 1. Следећи код то илуструје:
векторвтр.поп_бацк ();
флоат сз = втр.величина ();
цоут << sz << '\n';
Излаз је 3.
а.свап (б)
Два вектора могу се заменити, као што је приказано у следећем сегменту кода:
векторвектор
втр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
Имајте на уму да се дужина вектора повећава ако је потребно. Такође, вредности које нису имале замену замењују се неком подразумеваном вредношћу.
јасно()
Уклања све елементе из вектора, као што илуструје следећи сегмент кода:
векторвтр.јасно();
цоут << vtr.size() << '\n';
Излаз је 0.
Оператори за једнакост и релацију за векторе
Оператор ==
Враћа 1 за тачно ако су два вектора исте величине и одговарајући елементи су једнаки; у супротном, враћа 0 за фалсе. На пример:
векторвектор
боол бл = У == В;
цоут << bl << '\n';
Излаз је 0.
Тхе != Оператор
Приказује 1 за тачно ако два вектора немају једнаку величину и / или одговарајући елементи нису једнаки; у супротном, враћа 0 за фалсе. На пример:
векторвектор
боол бл = У!= В;
цоут << bl << '\n';
Излаз је 1.
Тхе < Operator
Приказује 1 за истинито ако је први вектор почетни подскуп другог вектора, с тим што су елементи два једнака дела исти и у истом редоследу. Ако су оба вектора исте величине и крећу се слева удесно и ако се у првом вектору нађе елемент који је мањи од одговарајућег елемента у другом вектору, тада ће 1 бити враћен. У супротном, враћа се 0 за фалсе. На пример:
векторвектор
боол бл = У
Излаз је 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.
Закључак
Вектор је пример контејнера за секвенце. Вектор је „бољи“ облик обичног низа и инстанциран је из класе. Вектори имају методе класификоване под: конструкција и додељивање, капацитет, приступ елементима, приступ подацима, итератори, модификатори и нумерички преоптерећени оператори.
Постоје и други контејнери секвенце, звани лист, форвард_лист и арраи. Ако задатак укључује честа уметања и брисања у средини низа, тада треба користити списак или прослеђени_лист. Ако задатак укључује честа уметања и брисања на почетку или на крају низа, тада треба користити декуе. Дакле, векторе треба користити само када ове врсте операција нису важне.