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

C Vektorski Iteratori



Главни итератори у Ц++ су Инпут Итератор, Оутпут Итератор, Форвард Итератор, Бидирецтионал Итератор и Рандом Аццесс Итератор. Обрнути итератор заправо није итератор; то је адаптор итератора. Постоје неке варијанте итератора, попут константног итератора.

Итератор је разрађен показивач. Попут показивача, он указује на објекте истог типа у меморији у различито време. Сви итератори су дереференцабилни, осим излазног итератора који је дереференцабилан само за скуп типова. Дереференцабилан значи да се вредност на коју указује показивач или итератор може добити помоћу индиректног оператора, *. Неким итераторима се може додати цео број на исти начин, а за исту сврху цео број би се додао у показивач.

Питања за овај чланак су: Шта су ови итератори? Који од ових итератора се користе са Ц++ вектором? Како се ови итератори користе са Ц++ вектором? Овај чланак одговара на сва ова питања на поједностављен начин. На крају овог чланка, када на сва ова питања буде одговорено, Ц++ векторски итератори ће бити интуитивни и природни (за читаоца).







Садржај чланка

Резиме Ц++ итератора

Инпут Итератор



Идеја итератора уноса је да програм прими улазну вредност. За разлику од излазног итератора, улазни итератор је увек дереференцабилан. За два улазна итератора, а и б, „а == б“ не значи „++а == ++б“.



Излазни итератор
Идеја излазног итератора је да програм ослободи излазну вредност. За разлику од улазног итератора, излазни итератор није увек дереференцабилан. Може се дереференцирати само за скуп типова.





Форвард Итератор
Итератор унапред може да скенира вектор од почетка до краја, један по један (инкрементирајући). Има све захтеве итератора за унос, плус додатне захтеве. Може да замени улазни итератор. За два напредна итератора, а и б, „а == б“ имплицира „++а == ++б“.

Бидирецтионал Итератор
Двосмерни Итератор може да скенира вектор од почетка до краја, један по један. Од краја до почетка, један по један (смањење). Има све захтеве итератора унапред, плус додатне захтеве. Може да замени итератор унапред. За два двосмерна итератора, а и б,



„а == б“ имплицира „++а == ++б“
и
„–а == –б“ имплицира „а == б“.

Итератор случајног приступа

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

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

Имајте на уму да Ц++ нема нормалан обрнути итератор јер има итератор унапред. Дакле, постоји адаптер који се зове Реверсе Итератор. Има још добрих вести: обрнути итератор испуњава све захтеве двосмерног итератора.

Константни итератор

Ако се за итератор каже да је конст итератор, елемент на који указује не може се модификовати.

Векторска конструкција и приступ

Контејнери у Ц++ су: низ класа, декуе, форвард_лист, листа, вектор, мапа, скуп, унордеред_мап и унордеред_сет. Вектор је контејнер. Одређени предлошци функција у стандардној библиотеци Ц++ раде са итераторима директно или индиректно. Ц++ контејнери, као и вектор, користе ове функције. Ове функције могу бити доступне Ц++ програму помоћу било које од следећих директива за укључивање:

#инцлуде <итератор>

или

#инцлуде <вектор>

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

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

Функција шаблона:

шаблон < класа Ц > цонстекпр ауто података ( Ц & ц ) - > децлтипе ( ц. података ( ) ) ;

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

Пример векторског објекта конструисаног са овим имплицитно је:

вектор < цхар > втр ;

Овде је објекат, ц, празан.

Функција шаблона:

шаблон < класа И > цонстекпр конст И * података ( иницијализатор_лист < И > Тхе ) ноекцепт ;

Овде је Е* итератор који указује на први елемент листе или контејнера. Његова употреба са вектором имплицитно би била са:

вектор < цхар > втр { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
вектор < цхар > :: цонст_итератор то = втр. започети ( ) ;

Функција шаблона је применљивија на почетну () изјаву (друга изјава).

Приступ

Функција шаблона:

шаблон < класа Ц > цонстекпр ауто величина ( конст Ц & ц ) - > децлтипе ( ц. величина ( ) ) ;

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

вектор < цхар > втр { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
инт Н = втр. величина ( ) ;
цоут << Н << ендл ;

Излаз је 5.

Функција шаблона:

шаблон < класа И > [ [ нодисцард ] ] цонстекпр боол празан ( иницијализатор_лист < И > Тхе ) ноекцепт ;

Враћа тачно ако је листа празна или нетачно у супротном. Векторски пример:

вектор < цхар > втр { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
боол са = втр. празан ( ) ;
цоут << са << ендл ;

Излаз је 0 за нетачно.

Ранге Аццесс

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

Функција шаблона:

шаблон < класа Ц > цонстекпр ауто започети ( Ц & ц ) - > децлтипе ( ц. започети ( ) ) ;

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

вектор < цхар > втр { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
вектор < цхар > :: итератор то = втр. започети ( ) ;
цоут << * то << ' ' ;

Излаз је А. Итератор који се овде враћа је итератор са случајним приступом. Могао је бити враћен итератор са сталним случајним приступом - погледајте касније.

Шаблон функције:

шаблон < класа Ц > цонстекпр ауто крај ( конст Ц & ц ) - > децлтипе ( ц. крај ( ) ) ;

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

вектор < цхар > втр { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
вектор < цхар > :: цонст_итератор то = втр. крај ( ) ;
-- то ;
цоут << * то << '' ;
-- то ;
цоут << * то << ендл ;

Излаз је 'Е Д'. Константни итератор може да се повећа или смањи, али вредност на коју указује не може да се промени. Могао је бити враћен нормалан итератор са случајним приступом - погледајте касније.

Шаблон функције:

шаблон < класа И > цонстекпр реверсе_итератор < конст И * > рбегин ( иницијализатор_лист < И > Тхе ) ;

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

вектор < цхар > втр { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
вектор < цхар > :: реверсе_итератор то = втр. рбегин ( ) ;
цоут << * то << '' ;
++ то ;
цоут << * то << ендл ;

Излаз је: Е Д. Са обрнутим итератором, ++ има супротан ефекат за двосмерни итератор.

Шаблон функције:

шаблон < класа И > цонстекпр реверсе_итератор < конст И * > чини ( иницијализатор_лист < И > Тхе ) ;

Тачке непосредно пре првог елемента листе. Векторски пример:

вектор < цхар > втр { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
вектор < цхар > :: реверсе_итератор то = втр. чини ( ) ;
-- то ;
цоут << * то << '' ;
-- то ;
цоут << * то << ендл ;

Излаз је А Б. Са обрнутим итератором, — има супротан ефекат за ++ двосмерног итератора.

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

Инсерт Итераторс

реверсе_итератор је адаптор итератора, а не заправо итератор. Итератор уметања је такође адаптер итератора. Задовољава све захтеве излазног итератора, плус сопствене захтеве. У Ц++ постоји у три облика: бацк_инсертер, фронт_инсертер и инсертер. Сваки од њих има свој конструктор.

бацк_инсертер:

Уметци позади!
Важни прототипови:

експлицитна бацк_инсерт_итератор ( Контејнер & Икс ) ;
бацк_инсерт_итератор & оператер = ( типенаме Контејнер :: тип вредности && вредност ) ;

Векторски пример:
Вектор нема функцију члана уметања која се умеће позади. Међутим, функција члана пусх_бацк(т) се може видети тако.

фронт_инсертер

Уметци на предњој страни!
Важни прототипови:

експлицитна фронт_инсерт_итератор ( Контејнер & Икс ) ;
фронт_инсерт_итератор & оператер = ( типенаме Контејнер :: тип вредности && вредност ) ;

Векторски пример:
Вектор нема ниједну функцију члана уметања која се умеће на предњој страни. Вектор такође нема функцију члана пусх_фронт(т).

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

инсертер

Овај итератор би убацио на почетак, унутар или на крај вектора.

Важни прототипови:

инсерт_итератор ( Контејнер & Икс, типенаме Контејнер :: итератор и ) ;
инсерт_итератор & оператер = ( типенаме Контејнер :: тип вредности && вредност ) ;

Векторски пример:

вектор < цхар > втр { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
вектор < цхар > :: итератор то = втр. започети ( ) ;
то = то + 2 ;
втр. уметнути ( то, 'ц' ) ;

за ( инт и = 0 ; и < втр. величина ( ) ; и ++ )
цоут << втр [ и ] << ', ' ;
цоут << ендл ;

Излаз је:

А, Б, в, Ц, Д, Е,

Израз уметања вектора је:

втр. уметнути ( то, 'ц' ) ;

Умеће елемент непосредно пре показивача (то) на који показује.

Премести Итератор

Мове_итератор је такође адаптор итератора. Следећи програм је сличан примеру који се налази у Ц++ спецификацији:

#инцлуде <иостреам>
#инцлуде <лист>
#инцлуде <вектор>
Користећи именског простора стд ;

инт главни ( )
{
листа < цхар > цхс { 'А' , 'Б' , 'Ц' , 'Д' , 'И' } ;
вектор < цхар > втр ( маке_мове_итератор ( цхс. започети ( ) ) , маке_мове_итератор ( цхс. крај ( ) ) ) ;

цоут << „Оригинални садржај листе:“ << ендл ;
за ( ауто то = цхс. започети ( ) ; то ! = цхс. крај ( ) ; то ++ )
цоут << * то << ', ' ;
цоут << ендл << ендл ;

цоут << „Векторски садржај:“ << ендл ;
за ( инт и = 0 ; и < втр. величина ( ) ; и ++ )
цоут << втр [ и ] << ', ' ;
цоут << ендл ;

повратак 0 ;
}

Излаз је:

Оригинални садржај листе:
А, Б, Ц, Д, Е,

Векторски садржај:
А, Б, Ц, Д, Е,

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

Закључак

Главни итератори у Ц++ су Инпут Итератор, Оутпут Итератор, Форвард Итератор, Бидирецтионал Итератор и Рандом-Аццесс Итератор. Стандардна библиотека Ц++ има неке шаблоне функција који користе ове итераторе. Вектор користи ове итераторе кроз шаблоне функција. Вектор има нека другачија имена за неке од ових итератора. Постоје и адаптори итератора, а то су: реверсе_итератор, адаптор итератор и мове_итератор. Постоје и неке варијанте итератора. Довољно је укључити у програм да бисте имали све ове карактеристике. Након разумевања улоге ових итератора, адаптора и шаблона функција који их користе, коришћење итератора са векторима постаје интуитивно.