Lista înainte în C ++ STL

Forward_list Containerul oferă implementarea Lista singuri legată Structura de date. Stochează date în memorie necontigue, unde fiecare element indică următorul element din secvență. Acest lucru face ca introducerea și ștergerea mai rapidă odată ce poziția elementului este cunoscută.

Sintaxă

Lista de înaintare este definită ca STD :: Forward_list șablon de clasă în interiorul < Forward_list > Fișier antet.

Forward_list FL;

unde

  • T: Tipul de date de elemente din lista înainte.
  • F: Numele atribuit listei de înaintare.

Declarație și inițializare

O listă forward_ poate fi declarată și inițializată în mai multe moduri, așa cum se arată în exemplul de mai jos:

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  ;   }   

Ieșire
4 4 4 1 5 3 4  

Exemplu: În programul de mai sus, suntem simpli lista inițializată inițial în trei moduri:

  • Declaraţie Forward_list FL1 Creează o listă goală de numere întregi.
  • Declaraţie Forward_list FL2 (34) Creează o listă înainte cu dimensiunea 3 și fiecare element fiind 4.
  • Declaraţie Forward_list fl3 = {1 5 3 4} Creează o listă înainte și inițializează cu elementele formează lista inițializantă.

Operații de bază

Iată operațiunile de bază pe care le putem efectua pe o listă înainte:

1. Accesarea elementelor

Elementele listei înainte nu pot fi accesate folosind indici precum tablouri sau vectori. Trebuie să parcurgem secvențial lista de la început până la poziția dorită pentru a o accesa. Acest lucru se poate face prin creșterea ÎNCEPE() iterator, dar este mai bine să folosești Următorul() sau avans() funcţie.

Cu toate acestea, primul element al listei poate fi accesat cu ușurință faţă() metodă.

Exemplu:

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  ;   }   

Ieșire
1 3 

Exemplu: În programul de mai sus, primul element este tipărit folosind faţă() metodă. Pentru a accesa al treilea element Următorul() se folosește pentru a muta iteratorul două poziții de la început și *it este folosit pentru a dereferenta iteratorul.

2. Introducerea elementelor

Elementele pot fi introduse în lista înainte folosind insert_after () funcţie. Necesită iteratorul după care elementul trebuie introdus. Oricât de rapidă este susținută inserția rapidă în față push_front () metodă.

Exemplu:

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  ;   }   

Ieșire
1 5 3 4  

Explicaţie: În acest program, primul element al listei forward_list este introdus în față folosind push_front () funcţie. Apoi un iterator este creat și mutat o poziție înainte folosind avans() funcţie. După aceea elementul 5 este introdus după al doilea element folosind insert_after () funcţie.

3. Actualizarea elementelor

Valoarea elementelor existente poate fi modificată pur și simplu prin accesarea acestora și folosind operator de atribuire Pentru a atribui noua valoare.

Exemplu:

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  ;   }   

Ieșire
111 333 

4. Element de găsire

Lista de înaintare nu oferă nicio funcție de membru pentru a căuta un element, dar putem folosi găsi() algoritm pentru a găsi orice valoare dată.

Exemplu :

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  ;   }   

Ieșire
3 

5. Traversare

O listă înainte poate fi traversată folosind ÎNCEPE() şi Sfârşit() Iteratoare cu o buclă, dar putem merge doar înainte și nu înapoi.

Exemplu:

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  ;   }   

Ieșire
1 5 3 4  

6. Ștergerea elementelor

În lista înainte putem șterge elementul în poziția dată folosind erase_after () metodă. Această metodă duce iteratorul într -o poziție înainte de elementul țintă. Ștergerea rapidă din față este posibilă folosind pop_front () metodă.

Exemplu:

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  ;   }   

Ieșire
5 3  

7. Mărimea listei înainte

Forward_list nu are o funcție de mărime () încorporată. Pentru a -și găsi dimensiunea, trebuie să numărăm manual elementele traversând -o cu o buclă sau folosind distanța 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  ;   }   

Ieșire
Size of forward_list: 4  

8. Gol ()

Este folosit pentru a verifica dacă lista înainte_ este goală.
Returnează adevărat dacă lista este goală și falsă, altfel, permițând să verifice rapid dacă containerul nu are date.

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  ;   }   

Ieșire
The forward_list is empty. The forward_list is not empty.  

Complexitatea timpului

Tabelul de mai jos listează complexitatea de timp a operațiunilor de mai sus pe lista înainte:

Operație Complexitatea timpului
Accesați primul element O (1)
Acces n Th element Pe)
Introduceți în față O (1)
Introduceți după o poziție specifică Pe)
Ștergeți primul element O (1)
Ștergeți după o poziție specifică Pe)
Traversal Pe)

Lista de avansare vs lista

Caracteristică

Forward_list

listă

Tipul listei legate

Lista singuri legată

Lista dublă legată

Traversal

Poate traversa doar înainte

Poate traversa atât înainte, cât și înapoi

Utilizarea memoriei

Utilizează mai puțină memorie (un singur indicator pe nod)

Utilizează mai multă memorie (două indicatoare pe nod)

Inserție/ștergere

Inserție și ștergere rapidă, dar numai la sau după o anumită poziție

Inserție și ștergere rapidă oriunde (înainte sau după o poziție)

Funcții acceptate

Limitat în comparație cu lista (fără dimensiuni () fără iteratori inversi)

Interfață mai completă, inclusiv iteratoare bidirecționale Size () Reverse ().