iterators stl
Пълен преглед на итераторите в STL.
В този урок ще разгледаме подробностите за итераторите, техните типове, предимства и различните функции, които те поддържат.
soapui интервю въпроси и отговори за опитни
Какво е итератор? По принцип итераторът е точно като всеки обект, който сочи към определен елемент в диапазон от данни като масив или контейнер. Итераторът е точно като указател в C.
=> Потърсете тук цялата серия за обучение на C ++.
Какво ще научите:
- Общ преглед
- Видове итератори
- Предимства на итераторите
- Функции на итератор
- Заключение
- Препоръчително четене
Общ преглед
В STL итераторът е обект, който може да се използва за преминаване през или преминаване през елементите в контейнера чрез използване на набор от оператори като оператор на инкремент (++) или оператор за пренасочване (*).
Итераторите са от решаващо значение при програмирането на STL, тъй като те играят важна роля при свързването на алгоритмите към контейнера в допълнение към достъпа и манипулирането на данните, съхранявани вътре в контейнерите.
Видове итератори
В зависимост от функционалността, внедрена от итераторите, те се класифицират, както следва:
- Входни и изходни итератори : Това са най-опростените типове итератори. Те са най-полезни при последователни операции вход-изход, съдържащи еднопроходни.
- Напред Итератори : Те са точно като входни итератори, но имат посока, т.е.посока напред в смисъла, в който могат да се използват за преминаване през диапазон в посоката на препращане. Когато итераторите за препращане не са постоянни, те също могат да се използват като изходни итератори. Повечето стандартни STL контейнери поне поддържат итератори напред.
- Двупосочни итератори : Те са подобни на препращащи итератори с единствената разлика, че са двупосочни. Това означава, че можем да използваме тези двупосочни итератори, за да преминем през обхвата в посока напред, както и назад.
- Итератори с произволен достъп : Итераторите с произволен достъп са най-мощни сред всички итератори. Това са непоследователни итератори. Итераторите с произволен достъп ни позволяват да осъществим достъп до произволна стойност чрез прилагане на отместване към текущата стойност, без да се налага да преминаваме през всеки елемент последователно. Те проявяват подобни свойства като указатели в C.
Едно нещо, което трябва да се отбележи е, че не всички STL контейнери поддържат всички итератори. Различните контейнери поддържат различни итератори в зависимост от изискванията на тяхната функционалност.
По-долу е списъкът на контейнери, които използват различни итератори:
Контейнери | Итератори |
---|---|
Карта | Двупосочна |
Стек | Няма итератор |
Опашка | Няма итератор |
Опашка с приоритет | Няма итератор |
Списък | Двупосочна |
Вектор | Произволен достъп |
и | Произволен достъп |
Multimap | Двупосочна |
Комплект | Двупосочна |
Multiset | Двупосочна |
Предимства на итераторите
Итераторите са изключително полезни, особено при програмиране, използвайки различни диапазони и контейнери.
Някои от предимствата на използването на итератори в програмирането могат да бъдат обобщени по-долу:
# 1) Многократна употреба на кода
Докато използваме итератори за достъп до елементи в нашата програма, ние можем просто да променим името на контейнера в нашата дефиниция на итератор и да използваме останалата част от кода по подобен начин, когато трябва да сменим контейнера.
Това е особено полезно в сценарии, при които планираме да заменим векторен контейнер с помощта на списъчен контейнер. Ако вместо итератори използвахме оператора [], кодът за достъп до елементи би бил безполезен, когато сменим контейнерите.
# 2) Лекота и удобство на програмирането
Итераторите се предлагат с различни вградени функции, които ни помагат при лесното и удобно преминаване и достъп до съдържанието на контейнера.
Например , не е нужно да продължаваме да проверяваме края на списъка или подобно на масив, което трябва да направим, докато използваме оператори [], и трябва да променим програмния код, както когато искаме да добавим елементи, и трябва да ги променим за цикъл .
Когато използваме итератори, можем да имаме директен достъп до функциите start () и end () на итераторите, без да се налага да държим раздела, когато стигнем до края на списъка, а също така не е необходимо да ги променяме за цикъл.
# 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; }
Изход:
С помощта на next () новият итератор е на: 2
Позицията на новия итератор с помощта на prev () е: 3
След операцията предварително, itr1 се позиционира на: 3
Използвайки горната програма, ние демонстрирахме използването на различни операции на итератори.
Заключение
Така стигнахме до края на този урок за итератори.
Досега обсъждахме основите на STL, от следващия урок нататък ще започнем със STL контейнери и тяхното програмиране.
=> Проверете пълната C ++ БЕЗПЛАТНА серия за обучение тук.
Препоръчително четене
- Приоритетна опашка в STL
- Масиви в STL
- 70+ НАЙ-ДОБРИ уроци за C ++, за да научите БЕЗПЛАТНО програмиране на C ++
- Струни, двойки и кортежи в STL
- ЗАДАВАНЕ В STL
- Алгоритми в STL
- Най-добрият БЕЗПЛАТЕН урок за C #: Най-доброто ръководство за C # за начинаещи
- Стандартна библиотека с шаблони (STL): Кратко въведение