Передній список у C ++ STL

Вперед_list контейнер забезпечує реалізацію Одинично пов'язаний список Структура даних. Він зберігає дані в недобросовісній пам'яті, де кожен елемент вказує на наступний елемент у послідовності. Це робить вставку та видалення швидше, коли буде відоме положення елемента.

Синтаксис

Передній список визначається як std :: forward_list Шаблон класу всередині < вперед_list > Файл заголовка.

вперед_list fl;

де

  • T: Тип даних елементів у списку вперед.
  • F: Ім'я, призначене до списку вперед.

Декларація та ініціалізація

Forward_List може бути оголошений та ініціалізований декількома способами, як показано в наведеному нижче прикладі:

C++
   #include          using     namespace     std  ;   void     printFL  (  forward_list   <  int  >&     fl  )     {      for     (  auto     i     :     fl  )      cout      < <     i      < <     ' '  ;      cout      < <     'n'  ;   }   int     main  ()     {          // Creating an empty forward_list      forward_list   <  int  >     fl1  ;      // Creating a forward_list with      // default value      forward_list   <  int  >     fl2  (  3       4  );          // Creating a forward_list from an      // initializer list      forward_list   <  int  >     fl3     =     {  1       5       3       4  };          printFL  (  fl2  );      printFL  (  fl3  );      return     0  ;   }   

Випуск
4 4 4 1 5 3 4  

Приклад: У наведеній вище програмі ми простий ініціалізований вперед список трьома способами:

  • Заява вперед_list Fl1 Створює порожній список цілих числа.
  • Заява вперед_list fl2 (34) Створює вперед список розміром 3, а кожен елемент - 4.
  • Заява вперед_list fl3 = {1 5 3 4} Створює вперед список і ініціалізує з елементами, що утворюють список ініціалізатора.

Основні операції

Ось основні операції, які ми можемо виконати в передньому списку:

1. Доступ до елементів

Елементи вперед списку не можуть бути доступні за допомогою таких індексів, як масиви або вектори. Ми повинні переглядати список послідовно від початку до потрібної позиції, щоб отримати доступ до нього. Це можна зробити шляхом збільшення розпочати () Ітератор, але його краще використовувати Далі () або Advance () функція.

Однак перший елемент списку можна легко дістатися фронт () метод.

Приклад:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };      // Access the first element      cout      < <     fl  .  front  ()      < <     endl  ;          // Access third element      auto     it     =     next  (  fl  .  begin  ()     2  );      cout      < <     *  it  ;      return     0  ;   }   

Випуск
1 3 

Приклад: У наведеній вище програмі перший елемент надруковано за допомогою фронт () метод. Для доступу до третього елемента Далі () використовується для переміщення ітератора двох позицій з самого початку і *це використовується для деференції ітератора.

2. Вставлення елементів

Елементи можна вставити в передовий список за допомогою insert_after () функція. Він вимагає ітератора, після якого елемент повинен бути вставлений. Однак швидке введення спереду підтримується push_front () метод.

Приклад:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  5       4  };      // Inserting Element at front      fl  .  push_front  (  1  );          // Insert 3 after the second element      auto     it     =     fl  .  begin  ();      advance  (  it       1  );      fl  .  insert_after  (  it       3  );          for     (  auto     x  :     fl  )     cout      < <     x      < <     ' '  ;      return     0  ;   }   

Випуск
1 5 3 4  

Пояснення: У цій програмі перший елемент Forward_List вставлений спереду за допомогою push_front () функція. Потім створюється ітератор і переміщує одну позицію вперед за допомогою Advance () функція. Після цього елемент 5 вставляється після другого елемента за допомогою insert_after () функція.

3. Оновлення елементів

Значення існуючих елементів можна змінити просто, отримавши доступ до них та використовуючи Оператор призначення для призначення нового значення.

Приклад:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };      // Updating first element      fl  .  front  ()     =     111  ;      cout      < <     fl  .  front  ()      < <     endl  ;          // Updating third element      auto     it     =     next  (  fl  .  begin  ()     2  );      *  it     =     333  ;      cout      < <     *  it  ;      return     0  ;   }   

Випуск
111 333 

4. Пошук елемента

Передній список не надає жодної функції учасника для пошуку елемента, але ми можемо використовувати знайти () Алгоритм для пошуку будь -якого значення.

Приклад :

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };      // Finding 3      auto     it     =     find  (  fl  .  begin  ()     fl  .  end  ()     3  );          if     (  it     !=     fl  .  end  ())     cout      < <     *  it  ;      else     cout      < <     'Element not Found'  ;      return     0  ;   }   

Випуск
3 

5. Поїздка

Передній список можна пройти за допомогою розпочати () і end () Ітератори з петлею, але ми можемо рухатися лише вперед, а не назад.

Приклад:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };          // Traversing using range-based for loop      for  (  auto     i     :     fl  )      cout      < <     i      < <     ' '  ;      cout      < <     endl  ;          return     0  ;   }   

Випуск
1 5 3 4  

6. Видалення елементів

У списку вперед ми можемо видалити елемент у заданому положенні за допомогою rease_after () метод. Цей метод переносить ітератор в одну позицію перед цільовим елементом. Швидке видалення спереду можливе використання pop_front () метод.

Приклад:

C++
   #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     fl     =     {  1       5       3       4  };      // Delete first element      fl  .  pop_front  ();          // Delete third element      auto     it     =     fl  .  begin  ();      advance  (  it       1  );      fl  .  erase_after  (  it  );          for     (  auto     x  :     fl  )     cout      < <     x      < <     ' '  ;      return     0  ;   }   

Випуск
5 3  

7. Розмір переднього списку

Forward_list не має функції вбудованого розміру (). Щоб знайти його розмір, нам потрібно вручну підрахувати елементи, проходячи його з петлею або використовуючи відстань std ::.

C++
   #include          #include         #include          using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     flist  =  {  10    20    30    40  };      //Calculate size by counting elements using std:: distance      int     size  =  distance  (  flist  .  begin  ()  flist  .  end  ());      cout   < <  'Size of forward_list: '   < <  size   < <  endl  ;      return     0  ;   }   

Випуск
Size of forward_list: 4  

8. порожній ()

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

C++
   #include          #include         using     namespace     std  ;   int     main  ()     {      forward_list   <  int  >     flist  ;      if     (  flist  .  empty  ())     {      cout      < <     'The forward_list is empty.'      < <     endl  ;      }      flist  .  push_front  (  10  );      if     (  !  flist  .  empty  ())     {      cout      < <     'The forward_list is not empty.'      < <     endl  ;      }      return     0  ;   }   

Випуск
The forward_list is empty. The forward_list is not empty.  

Складність часу

У наведеній нижче таблиці перераховано складність часу вищезазначених операцій у передньому списку:

Операція Складність часу
Доступ до першого елемента O (1)
Доступ N то елемент O (n)
Вставте спереду O (1)
Вставте після конкретного положення O (n)
Видалити перший елемент O (1)
Видалити після конкретної позиції O (n)
Обхід O (n)

Список передачі проти списку проти

Означати

вперед_list

список

Тип пов’язаного списку

Одинично пов'язаний список

Подвійно пов'язаний список

Обхід

Може пройти лише вперед

Може пройти як вперед, так і назад

Використання пам'яті

Використовує менше пам'яті (лише один вказівник на вузол)

Використовує більше пам'яті (два покажчики на вузол)

Вставка/видалення

Швидке вставлення та видалення, але лише на заданій позиції або після нього

Швидке вставлення та видалення в будь -якому місці (до або після положення)

Функції, що підтримуються

Обмежений порівняно зі списком (без розміру () без зворотних ітераторів)

Більш повний інтерфейс, включаючи розміру () зворотні () двонаправлені ітератори.