iterators stl
Повний огляд ітераторів в STL.
У цьому підручнику ми розглянемо деталі ітераторів, їх типи, переваги та різні функції, які вони підтримують.
python проти синтаксису c ++
Що таке ітератор? Загалом, ітератор схожий на будь-який об'єкт, який вказує на певний елемент у діапазоні даних, такий як масив або контейнер. Ітератор схожий на вказівник у C.
=> Шукайте тут цілу серію навчальних програм C ++.
Що ви дізнаєтесь:
Огляд
У STL ітератор - це об’єкт, який можна використовувати для обходу або проходження елементів у контейнері, використовуючи набір операторів, таких як оператор збільшення (++) або оператор відмінювання (*).
Ітератори мають вирішальне значення у програмуванні STL, оскільки вони відіграють важливу роль у підключенні алгоритмів до контейнера, крім доступу та керування даними, що зберігаються всередині контейнерів.
Типи ітераторів
Залежно від функціональних можливостей, реалізованих ітераторами, вони класифікуються таким чином:
- Вхідні та вихідні ітератори : Це найбільш спрощені типи ітераторів. Вони найбільш корисні в послідовних операціях введення-виведення, що містять однопрохідні.
- Вперед ітератори : Вони подібні до вхідних ітераторів, але мають напрямок, тобто напрямок вперед у тому сенсі, за яким їх можна використовувати для проходження діапазону в напрямку переадресації. Коли ітератори прямого перебігу не є постійними, їх також можна використовувати як вихідні ітератори. Більшість стандартних контейнерів STL принаймні підтримують прямі ітератори.
- Двонаправлені ітератори : Вони схожі на прямі ітератори з тією лише різницею, що вони двонаправлені. Це означає, що ми можемо використовувати ці двонаправлені ітератори для проходження діапазону як у прямому, так і в зворотному напрямку.
- Ітератори довільного доступу : Ітератори довільного доступу є найпотужнішими серед усіх ітераторів. Це не послідовні ітератори. Ітератори довільного доступу дозволяють нам отримати доступ до будь-якого випадкового значення, застосовуючи зміщення до поточного значення, не маючи необхідності проходити через кожен елемент послідовно. Вони виявляють подібні властивості, як покажчики в C.
Зазначимо одне, що не всі контейнери STL підтримують усі ітератори. Різні контейнери підтримують різні ітератори залежно від вимог їх функціональності.
Нижче наведено список контейнерів, які використовують різні ітератори:
Контейнери | Ітератори |
---|---|
Карта | Двонаправлений |
Стек | Немає ітератора |
Черга | Немає ітератора |
Черга пріоритетів | Немає ітератора |
Список | Двонаправлений |
Вектор | Випадковий доступ |
і | Випадковий доступ |
Мультимапа | Двонаправлений |
Встановити | Двонаправлений |
Мультимножина | Двонаправлений |
Переваги ітераторів
Ітератори надзвичайно корисні, особливо під час програмування з використанням різних діапазонів та контейнерів.
Деякі переваги використання ітераторів у програмуванні можуть бути зведені нижче:
# 1) багаторазове використання коду
Поки ми використовуємо ітератори для доступу до елементів у нашій програмі, ми можемо просто змінити назву контейнера у нашому визначенні ітератора та використати решту коду подібним чином, коли нам потрібно змінити контейнер.
Це особливо корисно в сценаріях, коли ми плануємо замінити векторний контейнер за допомогою контейнера списку. Якби замість ітераторів ми використовували оператор (), код доступу до елементів був би марним, коли ми міняємо контейнери.
# 2) Простота та зручність програмування
Ітератори постачаються з різними вбудованими функціями, які допомагають нам легко та зручно переходити та отримувати доступ до вмісту контейнера.
Наприклад , нам не потрібно продовжувати перевіряти кінець списку або подібний до масиву, який ми маємо зробити під час використання операторів (), і нам потрібно змінити програмний код, як коли ми хочемо додати елементи, і нам потрібно змінити їх на цикл .
Використовуючи ітератори, ми можемо отримати безпосередній доступ до функцій begin () і 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): Короткий вступ