logo

Итератори у Ц ++ СТЛ

Ан  итератор у Ц ++  је објект сличан показивању који указује на елемент СТЛ контејнера. Они се углавном користе за петљење кроз садржај СТЛ контејнера у Ц ++. Главна предност СТЛ итератора је да они чине СТЛ алгоритме независно од врсте коришћења контејнера. Можемо само да пренесемо итератора на елементе контејнера уместо саме спремника на СТЛ алгоритме.

Итераторска изјава

Сваки контејнер у Ц ++ СТЛ има свој итератор. Дакле, морамо да прогласимо итератора као:



C++
<type>::iterator it; 

где

  • Тип: Врста контејнера за коју је итератор проглашен.
  • То: Име додељено објекту итераторе.

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

C++
auto it = iter 

где итер Да ли је итератор додељен новоствореном ИТ Итератору.



Наш Ц ++ курс Покрива употребу итератора у СТЛ-у, осигуравајући да разумете како да пређете различите типове контејнера.

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

Доњи програм илуструје како користити итератора да пређе векторски контејнер:

C++
#include    using namespace std; int main() {  vector<int> v = {1 2 3 4 5};  // Defining an iterator pointing to  // the beginning of the vector  vector<int>::iterator first =  v.begin();  // Defining an iterator pointing  // to the end of the vector  vector<int>::iterator last =  v.end();    // Iterating the whole vector  while(first != last) {  cout << *first << ' ';  first++;  }  return 0; } 

Излаз
1 2 3 4 5 

Као што сте можда приметили да смо користили Вектор :: Почетак () и вектор :: ЕНД () Функција. Ове функције су функције чланице на СТД :: Вектор који враћа итератора на први и један елемент након последњег елемента вектора. Користимо итераторе који се враћају да су ове функције да се инерише вектори.



Функције контејнера Итератор

Ц ++ СТЛ пружа неке функције чланова у СТЛ контејнер који враћа итераторе на бар први и последњи елемент. Ове функције чланова су дефинисане скоро свим СТЛ контејнерима (остављајући неке ограничене приступе контејнере попут стака редак ) са истим именом за доследност.

Следећа табела наводи све методе које враћа итератора на контејнере:

Функција итератора

Повратна вредност

за почетак ()

Враћа итератора на почетак контејнера.

крај ()

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

Цбегин ()

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

неколико ()

кључ кандидата

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

рбегин ()

Враћа преокрет итератора на почетак контејнера.

Рендер ()

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

ЦРБЕГИН ()

Враћа константан преокрет итератор на почетак контејнера.

Цренд ()

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

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

C++
vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend()  vec.cend() vec.crend() 

Операције итераторима

Баш као и покажите аритметика о показивању, постоје неке операције које су дозвољене на Ц ++ итераторима. Користе се за пружање различитих функционалности које повећавају важност итератора. Постоје 5 валидних Операције итератора у Ц ++ :

  • Дереференцирање итераторе
  • Повећање / смањење итератора
  • Додавање / одузимање целог броја у итераторе
  • Одузимање другог итератора
  • Упоређивање итератора

Дереференцирање итераторе

Операција у поремећајима омогућава корисницима да Приступ или ажурирање вредност елемента који је одредио итератор. Користимо (*) оператор индиректора до одељења итератора баш као што су показивачи.

C++
// Access *it; // Update *it = new_val;  

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

Повећање / смањење итератора

Можемо повећати или смањити итератора са 1 користећи (++) или (-) оператори редом. Рад повећања покреће итератора на следећи елемент у контејнеру док операција смањења помера итератора на претходни елемент.

C++
it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement 

Додавање / одузимање целог броја у итераторе

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

C++
// Addition it + int_val;  // Subtraction it - int_val;  

где инт_вал да ли су цели бројне вредности које се додају или одузимају од итератора то .

Одузимање другог итератора

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

C++
it1 - it2 

Упоређивање итератора

Такође можемо да тестирамо два итерататора истог типа једни о другима да бисмо пронашли однос између њих. Можемо да користимо релацијске операторе попут (==) једнакости и (! =) Операторе неједнакости, заједно са другим релацијским оператерима као што су< > <= >=.

C++
it1 != it2 // Equal to it1 == it2 // Not equal to it1 > it2 // Greater than it1 < it2 // Less than it1 >= it2 // Greater than equal to it1 <= it2 // Less than equal to 

Врсте итератора у Ц ++

СТЛ итератори могу се поделити на основу операција које се могу извршити на њима. Постоје 5 главних врста итератора у Ц ++ који су наведени у доњој табели заједно са подржаним контејнерима и подржаним операцијама итератора.

Итератор

Опис

Подржани контејнери

Подржане операције

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

То је једносмерни итератор који се користи за читање вредности.

Улазни ток

Површина поремећаја једнакост

Излазни итератор

То је такође једносмерни итератор, али користи се за доделу вредности. Не може приступити вредностима.

Излазни ток

Повећање само уписање (само написати)

Напред итератори

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

напред_лист је уговор_мап урорд_сет

Површина поремећаја једнакост

Двосмерни итератори

Може се кретати у оба правца или напред или назад. Контејнери попут скупа листе и МултиМап подржавају двосмерне итератеље.

Листа МУЛТИМАП МУЛТИСЕТ МУЛТИМАП МУЛТИСТЕ

Површина поремећаја / једнакост смањења

Насумични приступите итераторима

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

ВЕЦТОР ДЕКУЕР Стринг Стринг

колико је 10 од 100

Све

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

Итераторска адаптера

Адаптери Итератор у Ц ++ су посебна врста итератора који су саграђени традиционалним итераторима како би пружили специјализовану функционалност. Постоје многи адаптери Итератора у Ц ++ који су некима дате у даљем тексту:

Тип адаптера итератора

Опис

Обрнути итератор

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

Стреам итераторе

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

Померите итератеље

Померите итераторе користе се за увођење семантике покретања у СТЛ алгоритама. Итератори померања прелазе власништво над копираним контејнерским подацима на контејнеру за копирање без стварања додатних примерака.

Усертер Итератор

Итератори уметања омогућава вам да унесете дате елементе на неки положај у контејнеру. Постоје три уметничка итератора у Ц ++:

  1. Бацк_Инсерт_тератор: Убаците на задњој страни контејнера.
  2. фронт_инсерт_тератор: Уметци на предњем делу контејнера.
  3. ИНСЕРТ_ТИТЕР: Уметање било где у контејнеру.

Ови итератори се могу креирати користећи Бацк_инсертер () фронт_инсертер () уметак () Функције у Ц ++.

Телекције програма Итератор у Ц ++

Ц ++ СТЛ пружају различиту функцију да поједноставе рад са итераторима. Они су наведени у доњем столу:

Функција Опис Синтакса
СТД :: Адванце Наставите итератора одређеним бројем позиција. унапред ( то н )
СТД :: Следеће Враћа итератора који је одређени број позиција испред датог итератора. следећи ( то н )
СТД :: прев Враћа итератора који је одређени број позиција иза дате итераторе. прев ( то н )
СТД :: Удаљеност Враћа број елемената између два итератора. растојање ( ИТ1 ИТ2 )
СТД :: ПочетакВраћа итератора на први елемент датог контејнера. почнити ( контејнер )
СТД :: ЕНДВраћа итератора на елемент након последњег елемента дате контејнера. крај ( контејнер )
СТД :: РБегинВраћа реверзни итератор до последњег елемента дате контејнера. рбегин ( контејнер )
СТД :: РендВраћа преокрет итератора на елемент који претходи првом елементу датог контејнера. чинити ( контејнер )
СТД :: Усертер Ствара итератору за уметање који убацује елементе у контејнер на одређени положај. уметник ( положај контејнера )
СТД :: Бацк_инсертер Ствара леђа убаците итератору који додаје елементе до краја контејнера. бацк_инсертер ( контејнер )
СТД :: ФРОНТ_ИРСЕРТЕР Ствара предњи уметник итератор који убацује елементе на предњој страни контејнера. фронт_инсертер ( контејнер )

Примене итератора са примерима

Итератори се интензивно користе у Ц ++ у много различитих сврха током рада са СТЛ контејнерима и алгоритамима. Следе неке примарне апликације итератора у Ц ++ који су њихови примери кода:

Прелазећи контејнере

Траверсинг СТЛ контејнери је најосновнија примјена итератора. У овоме користимо почне () и завршавају () функције да бисте добили итераторе за почетак и крај да пређе целокупни контејнер. У основи непрестано повећавамо почетни итератор док не буде једнак крају.

Пример

C++
#include    using namespace std; int main() {  set<int> s = {10 20 30   40 50};  // Iterator to the beginning   // of the set  auto it = s.begin();  // Iterating through the   // entire set  while (it != s.end()) {    // Dereferencing iterator   // to access value  cout << *it << ' ';    // Incrementing the   // iterator  it++;  }    return 0; } 

Излаз
10 20 30 40 50 

Као што је приказано у коду изнад, прелазимо сет контејнер. Слично томе можемо користити исти приступ да пређемо било који контејнер.

Преокретање контејнера

Реверсе Итератс омогућавају вам да пређете контејнер са краја на почетак, а да не треба ручно руковање преокретом.

Пример

C++
#include    using namespace std; int main() {  vector<int> vec = {10 20 30   40 50};  // Defining reverse iterators   // pointing to the reverse   // beginning of vec  auto it = vec.rbegin();  // Iterating the whole   // vector in reverse  while (it != vec.rend()) {  cout << *it << ' ';  it++;  }  return 0; } 

Излаз
50 40 30 20 10 

Алгоритми независни контејнер

Итератори омогућавају алгоритмима да раде са било којом функцијом која чини функције СТД :: Сортирај () СТД :: Пронађи () и СТД :: Фор_ацх () Флексибилнији. Можете да прођете итераторе уместо стварног контејнера.

Пример

C++
#include    using namespace std; int main() {  vector<int> vec = {30 10 40   10 50};  multiset<int> ms = {10 30 10   20 40 10};  // Using the std::count() algorithm to count  // the number of occurences of 10 in vector  // and multiset using iterator  cout << '10s in Vector: '   << count(vec.begin()  vec.end() 10) << endl;  cout << '10s in Multiset: '   << count(ms.begin()  ms.end() 10);  return 0; } 

Излаз
10s in Vector: 2 10s in Multiset: 3

Додатне апликације итератора

Постоје више апликација СТЛ итератора:

  • Прорачун растојања: Коришћење СТД-а :: Удаљеност () Итератори помажу у израчунавању броја елемената између две положаја у контејнеру.
  • Итерарација потока: Стреам Итератс омогућавају вам да лечите улазне / излазне токове попут контејнера олакшавају читање и писање у стрими користећи СТЛ алгоритме.
  • Померите семантику у СТЛ алгоритми: Премјештање итератора уводи семантику Пометање у СТЛ алгоритми који помаже у повећању перформанси и ефикасности избегавањем непотребног копирања. Подаци ће се преместити у складу са правилима померања семантике.
  • Прилагођени итератори за структуре података: Прилагођени итератори могу се применити за не-СТЛ структуре података попут дрвећа или графикона како би пружили подршку СТЛ алгоритама и многим другим функцијама. Можда ће нам можда требати да следимо неколико сета правила и конвенција да бисмо пружили правилно повећање смањења и других операција.