logo

Ітератори в C ++ STL

АН  Ітератор у C ++  -це вказівний об’єкт, який вказує на елемент контейнера STL. Вони, як правило, використовуються для петлі через вміст контейнера STL в C ++. Основна перевага ітераторів STL полягає в тому, що вони роблять алгоритми STL незалежними від типу використовуваного контейнера. Ми можемо просто передати ітератор до елементів контейнера замість самого контейнера до алгоритмів STL.

Декларація ітератора

Кожен контейнер у C ++ STL має свій ітератор. Тож ми повинні оголосити ітератор як:



C++
<type>::iterator it; 

де

  • Тип: Тип контейнера, для якого оголошується ітератор.
  • це: Ім'я, присвоєне об'єкту ітератора.

Потім ми можемо ініціалізувати його, призначивши дійсне ітератор. Якщо у нас вже є ітератор, який повинен бути призначений під час делькарації, ми можемо пропустити декларацію типу за допомогою автоматичний Ключове слово.

C++
auto it = iter 

де Ітер - це ітератор, призначений новоствореному його ітератору.



Наш Курс C ++ Покриває використання ітераторів у STL, гарантуючи, як ви розумієте, як переходити різні типи контейнерів.

Приклад ітераторів

Програма нижче ілюструє, як використовувати ітератор для переходу вектора контейнера:

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 

Як ви, можливо, помітили, що ми використовували Вектор :: start () та vector :: end () функція. Ці функції є функціями -членами для std :: вектора, який повертає ітератор до першого та одного елемента після останнього елемента вектора. Ми використовуємо ітератори, які повертаються, будьте ці функції, щоб повторювати вектори.



Функції ітератора контейнера

C ++ STL забезпечує деякі функції члена в Контейнер STL Це повертає ітератори щонайменше першого та останнього елемента. Ці функції члена визначаються майже у всьому контейнері STL (залишаючи деякі контейнери з обмеженим доступом, як стек черга ) з однойменною назвою для послідовності.

У наступній таблиці перераховані всі методи, які повертають ітератор до контейнерів:

Функція ітератора

Повернути значення

розпочати ()

Повертає ітератор до початку контейнера.

end ()

Повертає ітератор до теоретичного елемента відразу після останнього елемента контейнера.

cbegin ()

Повертає постійний ітератор до початку контейнера. Постійний ітератор не може змінити значення елемента, на який він вказує.

Кілька ()

c випадкове число

Повертає постійний ітератор до теоретичного елемента відразу після останнього елемента контейнера.

rbegin ()

Повертає зворотний ітератор до початку контейнера.

візуалізація ()

Повертає зворотний ітератор до теоретичного елемента відразу після останнього елемента контейнера.

crbegin ()

Повертає постійний зворотний ітератор до початку контейнера.

Crend ()

Повертає постійний зворотний ітератор до теоретичного елемента відразу після останнього елемента контейнера.

Наприклад, якщо річ - назва вектора, тоді ми можемо використовувати вищезазначені методи, як показано нижче:

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

Операції ітераторів

Так само, як арифметика вказівника, є деякі операції, які дозволені на ітераторах C ++. Вони використовуються для забезпечення різних функціональних можливостей, що збільшує важливість ітераторів. Є 5 дійсних Ітераторні операції в C ++ :

  • Дереференція ітераторів
  • Збільшення/зменшення ітераторів
  • Додавання/віднімання цілого числа до ітераторів
  • Віднімання іншого ітератора
  • Порівняння ітераторів

Дереференція ітераторів

Дереференція операції дозволяє користувачам Доступ або оновлення значення елемента, вказаного ітератором. Ми використовуємо (*) оператор непрямого до ітераторів дефератів, як і покажчики.

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

де 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;  

де 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 

Типи ітераторів у C ++

Ітератори STL можна розділити на основі операцій, які можуть бути виконані на них. У C ++ існує 5 основних типів ітераторів, які, як зазначено в таблиці нижче, разом із підтримуваними контейнерами та підтримуваними операціями ітератора.

Ітератор

Опис

Підтримувані контейнери

Підтримувані операції

Введіть ітератор

Це односторонній ітератор, який використовується для читання значень.

Вхідний потік

Дереференція збільшення рівності

Вийміть ітератор

Це також односторонній ітератор, але використовується для присвоєння значень. Він не може отримати доступ до значень.

Вихідний потік

Дереференція (лише писати) Приріст

Ітератори вперед

Він може отримати доступ і а також присвоювати значення. Це поєднання як вхідного, так і вихідного ітератора.

forward_list unlodered_map unloorded_set

Дереференція збільшення рівності

Двонаправлені ітератори

Він може рухатися в обох напрямках або вперед, або назад. Контейнери, такі як набір списку та мультимап, підтримують двонаправлені ітератори.

Список набору карт Multimap Multiset

Рівність збільшення/зменшення рівності

Ітератори випадкового доступу

Ітератори з випадковим доступом-це ітератори, які можна використовувати для доступу до елементів на відстані від елемента, який вони вказують на пропонування тієї ж функціональності, що і покажчики.

векторний рядок масиву Deque

клас математики java

Все

Як ми, можливо, помітили з вищевказаної таблиці, крім вхідних та вихідних ітераторів Коли ми спускаємося по таблиці, тип ітератора містить функції вище ітератора разом з новими функціями.

Ітераторні адаптери

Ітераторні адаптери в C ++ - це спеціальний тип ітераторів, які побудовані над традиційними ітераторами для забезпечення спеціалізованої функціональності. У C ++ існує багато адаптерів ітераторів, деякі з яких наведені нижче:

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

Опис

Зворотний ітератор

Зворотний ітератор побудований над двонаправленим або вище типу оператора і дозволяє користувачам переходити контейнер у зворотному напрямку.

Ітератори передають трансляцію

Ітератори потоку, а саме ISTREAM та ITERATORS OSTREAM, побудовані відповідно на вхідних та вихідних ітераторах. Ці ітератори дозволяють користувачам використовувати потоки як контейнери.

Перемістіть ітератори

Рух ітератори використовуються для введення семантики Move в алгоритмах STL. Ітератори переміщення переміщують право власності на копіювані дані контейнера до контейнера для копіювання, не створюючи додаткових копій.

Ітератор вставки

Ітератори вставки дозволяють вставити задані елементи в певне положення в контейнері. У C ++ є три ітератори вставки:

  1. back_insert_iterator: Вставки в задній частині контейнера.
  2. front_insert_iterator: Вставки в передній частині контейнера.
  3. insert_iterator: Вставки в будь -якій точці контейнера.

Ці ітератори можна створити за допомогою back_inserter () front_inserter () Вставити () Функції в C ++.

Функції утиліти ітератора в C ++

C ++ STL надає різну функцію для спрощення роботи з ітераторами. Вони вказані в таблиці нижче:

Функціонування Опис Синтаксис
std :: аванс Адсує ітератор за певною кількістю позицій. просуватися ( це n )
std :: далі Повертає ітератор, який є вказаною кількістю позицій перед даним ітератором. наступний ( це n )
Std :: prev Повертає ітератор, який є вказаною кількістю позицій за даним ітератором. попередньо ( це n )
std :: відстань Повертає кількість елементів між двома ітераторами. відстань ( It1 It2 )
std :: початиПовертає ітератор до першого елемента даного контейнера. починати ( контейнер )
std :: кінецьПовертає ітератор до елемента, що слідує за останнім елементом даного контейнера. кінець ( контейнер )
std :: rbeginПовертає зворотний ітератор до останнього елемента даного контейнера. rbegin ( контейнер )
std :: RendПовертає зворотний ітератор до елемента, що передує першому елементу заданого контейнера. робити ( контейнер )
std :: вставка Створює ітератор вставки, який вставляє елементи в контейнер у визначеному положенні. вставка ( Контейнерне положення )
std :: back_inserter Створює задню вставку ітератор, який додає елементи до кінця контейнера. back_inserter ( контейнер )
std :: front_inserter Створює фронт вставити ітератор, який вставляє елементи в передній частині контейнера. front_inserter ( контейнер )

Застосування ітераторів із прикладами

Ітератори широко використовуються в C ++ для багатьох різних цілей під час роботи з контейнерами та алгоритмами STL. Нижче наведено деякі основні програми ітераторів у C ++, які їх приклади коду:

Перехід контейнерів

Перехід контейнерів STL - це найосновніше застосування ітераторів. У цьому ми використовуємо функції start () та end (), щоб отримати ітератори для початку та закінчення, щоб пройти весь контейнер. В основному ми продовжуємо збільшувати ітератор, поки він не дорівнює кінцеві.

Приклад

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 

Алгоритми, незалежні від контейнерів

Ітератори дозволяють алгоритмам працювати з будь -якими функціями, що створюють тип контейнера, як, наприклад, std :: sort () std :: find () та std :: for_each () більш гнучкі. Ви можете передати ітератори замість фактичного контейнера.

Приклад

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

Додаткові програми ітераторів

Існує більше застосувань ітераторів STL:

  • Розрахунок відстані: Використання Ітераторів STD :: Відстань () допомагає обчислити кількість елементів між двома позиціями в контейнері.
  • Ітерація потоку: Ітератори потоків дозволяють вам лікувати вхідні/вихідні потоки, як контейнери, що полегшує читання та запису в потоки за допомогою алгоритмів STL.
  • Перемістіть семантику в алгоритмах STL: Move Iterators впроваджує семантику Move в алгоритмах STL, що допомагає підвищити продуктивність та ефективність, уникаючи зайвого копіювання. Дані будуть переміщені відповідно до правил Move Semantics.
  • Спеціальні ітератори для структур даних: Спеціальні ітератори можуть бути реалізовані для не STL-структур, таких як дерева або графіки, щоб забезпечити підтримку алгоритмів STL та багатьох інших функцій. Можливо, нам доведеться дотримуватися кількох набору правил та конвенцій, щоб забезпечити належне збільшення зменшення та інші операції.