iterators stl
Комплетан преглед итератора у СТЛ-у.
У овом упутству ћемо проучити детаље итератора, њихове типове, предности и разне функције које подржавају.
је мрежни сигурносни кључ исти као лозинка
Шта је Итератор? Генерално, итератор је попут сваког објекта који упућује на одређени елемент у опсегу података попут низа или контејнера. Итератор је баш попут показивача у Ц.
=> Овде потражите целу серију обука за Ц ++.
Шта ћете научити:
Преглед
У СТЛ-у, итератор је објекат који се може користити за кретање кроз елементе у контејнеру или за њихово прелазак кроз њих, користећи скуп оператора попут оператора прираста (++) или оператора дереференцирања (*).
Итератори су пресудни у СТЛ програмирању, јер играју важну улогу у повезивању алгоритама са контејнером, поред приступа и манипулације подацима ускладиштеним унутар контејнера.
Врсте поновитеља
У зависности од функционалности коју имплементирају итератори, класификују се на следећи начин:
- Улазни и излазни итератори : Ово су најједноставнији типови итератора. Најкориснији су у секвенцијалним улазно-излазним операцијама које садрже једнопролазни сигнал.
- Напријед Итератори : Ово су попут улазних итератора, али имају правац, тј. Правац напред у смислу да се могу користити за прелазак кроз опсег у смеру прослеђивања. Када итератори унапред нису константни, они се такође могу користити као излазни итератори. Већина стандардних СТЛ контејнера подржава барем напредне итераторе.
- Двосмерни поновитељи : Они су слични проследљивим итераторима с једином разликом што су двосмерни. То значи да ове двосмерне итераторе можемо користити за прелазак кроз опсег у правцу напријед и назад.
- Итератори са случајним приступом : Итератори са случајним приступом су најмоћнији међу свим итераторима. То су несеквенцијални итератори. Итератори са случајним приступом омогућавају нам приступ било којој случајној вредности применом померања на тренутну вредност без потребе за секвенцијалним пролазом кроз сваки елемент. Показују слична својства попут Поинтера у Ц.
Треба напоменути да сви СТЛ контејнери не подржавају све итераторе. Различити контејнери подржавају различите итераторе у зависности од захтева њихове функционалности.
Испод је листа контејнера који користе различите итераторе:
Контејнери | Итераторе |
---|---|
Мапа | Двосмерно |
Гомила | Нема итератора |
Ред чекања | Нема итератора |
Редослед приоритета | Нема итератора |
Листа | Двосмерно |
Вецтор | Директног приступа |
и | Директног приступа |
Мултимап | Двосмерно |
Комплет | Двосмерно |
Мултисет | Двосмерно |
Предности итератора
Итератори су изузетно корисни, посебно током програмирања користећи различите домете и контејнере.
Неке од предности употребе итератора у програмирању могу се сажети у наставку:
# 1) Поновна употреба кода
Све док користимо итераторе за приступ елементима у нашем програму, можемо само променити име контејнера у нашој дефиницији итератора и користити остатак кода на сличан начин кад год треба да променимо контејнер.
Ово је посебно корисно у сценаријима где планирамо да заменимо векторски контејнер помоћу контејнера са листом. Ако бисмо уместо итератора користили оператор (), код за приступ елементима био би бескористан када мењамо контејнере.
# 2) Једноставност и погодност програмирања
Итератори долазе са различитим уграђеним функцијама које нам помажу у лаганом и погодном кретању и приступу садржају контејнера.
На пример , не треба да наставимо да проверавамо крај листе или као низ који морамо да радимо док користимо () операторе и морамо да променимо програмски код као када желимо да додамо елементе, а морамо да их променимо за петљу .
Када користимо итераторе, можемо директно приступити функцијама старт () и енд () итератора, без потребе да држимо картицу када стигнемо до краја листе, а такође их не морамо мењати због петље.
# 3) Динамично додавање / уклањање
Док користимо итераторе, лако и динамички можемо додавати или уклањати елементе у контејнеру без потребе за померањем елемената као што то морамо да радимо у () операторима.
Покажимо то на следећем примеру:
#include #include using namespace std; int main() { vector vec1 = { 1, 1, 2 }; // Declaring an iterator vector::iterator i; // Inserting element for (i = vec1.begin(); i != vec1.end(); ++i) { if (i == vec1.begin()) { i = vec1.insert(i, 3); // insert 3 at the beginning of vec1 } } // contents of vec1 3 1 1 2 cout<<'Vector contents after addition'; cout< Излаз:
Садржај вектора након додавања
3 1 1 2
Садржај вектора након брисања
3 1 2
Као што се види у горњем примеру, видимо да помоћу итератора можемо лако додати или уклонити елементе из контејнера (вектор у овом случају), без потребе да прибегавамо сложеном програмирању померања елемената и реструктурирању контејнера.
Итератор функције
Како су сами итератори уграђени конструкти, они подржавају разне операције које се могу обавити на објектима итератора. Ове операције / функције омогућавају нам ефикасно кретање кроз опсег и такође манипулисање елементима унутар контејнера.
Сада ћемо видети неколико главних операција које итератори подржавају.
- започети: Враћа прву или почетну позицију итератора.
- крај: Враћа последњу позицију или позицију „након завршетка“ итератора.
- прев: Враћа нови итератор након смањења броја позиција даних у аргументу.
- следећи: Враћа нови итератор након напредовања или повећања броја позиција даних у аргументу.
- уметак: Умеће елемент у било коју позицију у контејнеру.
- аванс: Повећава позицију итератора на наведени број дат у аргументу.
Показаћемо употребу неке од ових функција / операција у следећем програму:
#include #include #include using namespace std; int main() { vector v = { 1, 1,2,3,5 }; // declaring iterators to a vector vector::iterator itr1 = v.begin(); vector::iterator itr2 = v.end(); auto it = next(itr1, 2); // displaying iterator position cout << 'Using next() the new iterator is at: '; cout << *it << ' '; cout << endl; auto it1 = prev(itr2, 2); // displaying iterator position cout << 'The position of new iterator using prev() is: '; cout << *it1 << ' '; cout << endl; //advance advance(itr1,3); // displaying iterator position cout << 'After advance operation,itr1 is positioned at: '; cout << *itr1 << ' '; cout << endl; return 0; }
Излаз:
Користећи нект () нови итератор је на: 2
Положај новог итератора помоћу прев () је: 3
Након претходне операције, итр1 се позиционира на: 3
Користећи горњи програм показали смо употребу различитих операција итератора.
Закључак
Тако смо дошли до краја овог водича о итераторима.
До сада смо разговарали о основама СТЛ-а, од нашег следећег упутства надаље ћемо почети са СТЛ контејнерима и њиховим програмирањем.
=> Овде погледајте комплетну Ц ++ БЕСПЛАТНУ серију обука.
Препоручено читање