Popis naprijed u C ++ STL

Naprijed_list spremnik pruža provedbu pojedinačno povezani popis Struktura podataka. Podaci pohranjuje u neprekidnoj memoriji gdje svaki element pokazuje na sljedeći element u nizu. Zbog toga brže umetanje i brisanje nakon što je poznat položaj elementa.

Sintaksa

Popis naprijed definiran je kao std :: naprijed_list predložak klase unutar < naprijed_list > Datoteka zaglavlja.

naprijed_list fl;

gdje

  • T: Vrsta podataka elemenata na popisu naprijed.
  • F: Ime dodijeljeno popisu naprijed.

Izjava i inicijalizacija

Awork_list može se deklarirati i inicijalizirati na nekoliko načina kao što je prikazano u donjem primjeru:

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

Izlaz
4 4 4 1 5 3 4  

Primjer: U gornjem programu smo jednostavni inicijalizirani popis naprijed na tri načina:

  • Izjava naprijed_list Fl1 Stvara prazan popis cijelih brojeva.
  • Izjava naprijed_list FL2 (34) Stvara list naprijed veličine 3, a svaki element je 4.
  • Izjava naprijed_list fl3 = {1 5 3 4} Stvara popis naprijed i inicijalizira se s elementima s popisom inicijalizatora.

Osnovne operacije

Evo osnovnih operacija koje možemo izvesti na popisu naprijed:

1. Pristup elementima

Elementima popisa naprijed ne može se pristupiti pomoću indeksa poput nizova ili vektora. Moramo proći kroz popis uzastopno od početka do željenog položaja kako bismo mu pristupili. To se može učiniti povećanjem početi() iterator, ali bolje je koristiti sljedeći() ili Advance () funkcija.

Međutim, prvi element popisa može se lako pristupiti ispred() metoda.

Primjer:

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

Izlaz
1 3 

Primjer: U gornjem programu prvi se element ispisuje pomoću korištenja ispred() metoda. Za pristup trećem elementu sljedeći() koristi se za pomicanje iteratora dva položaja od početka i *to koristi se za uklanjanje iteratora.

2. Umetanje elemenata

Elementi se mogu umetnuti na popis naprijed koristeći insert_after () funkcija. Zahtijeva iterator nakon kojeg se element treba umetnuti. Međutim, brzo umetanje na prednji dio podržava Push_Front () metoda.

Primjer:

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

Izlaz
1 5 3 4  

Obrazloženje: U ovom se programu prvi element naprijed_liste ubacuje na prednji dio pomoću Push_Front () funkcija. Tada se stvara iterator i pomakne jedan položaj prema naprijed koristeći Advance () funkcija. Nakon toga element 5 je umetnut nakon drugog elementa pomoću insert_after () funkcija.

3. Ažuriranje elemenata

Vrijednost postojećih elemenata može se promijeniti jednostavnim pristupom im i upotrebom dodjeljivanje dodijeliti novu vrijednost.

Primjer:

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

Izlaz
111 333 

4. Pronalaženje elementa

Popis naprijed ne pruža nijednu funkciju člana za traženje elementa, ali možemo koristiti pronaći() Algoritam za pronalaženje bilo koje date vrijednost.

Primjer ::

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

Izlaz
3 

5. Prolazak

Popis prema naprijed može se proći koristeći početi() i kraj() Iteratori s petljom, ali možemo samo naprijed, a ne natrag.

Primjer:

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

Izlaz
1 5 3 4  

6. Brisanje elemenata

U popisu naprijed možemo izbrisati element na danom položaju koristeći erase_after () metoda. Ova metoda preuzima iterator u jedan položaj prije ciljnog elementa. Brza brisanje s prednje strane moguće je koristiti pop_front () metoda.

Primjer:

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

Izlaz
5 3  

7. Veličina popisa naprijed

FORTHER_LIST nema funkciju ugrađene veličine (). Da bismo pronašli njegovu veličinu, moramo ručno brojati elemente prelaskom petljom ili pomoću STD :: Udaljenost.

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

Izlaz
Size of forward_list: 4  

8. prazno ()

Koristi se za provjeru je li naprijed_list prazan.
Vraća istinito ako je popis prazan i lažan, inače, omogućava brzo provjeru ima li spremnik podatke.

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

Izlaz
The forward_list is empty. The forward_list is not empty.  

Vremenska složenost

Donja tablica navodi vremensku složenost gore navedenih operacija na popisu naprijed:

Operacija Vremenska složenost
Pristup prvom elementu O (1)
Pristup n th element Na)
Umetnite ispred O (1)
Umetnite nakon određenog položaja Na)
Izbriši prvi element O (1)
Izbrišite nakon određenog položaja Na)
Prelazak Na)

Popis naprijed prema listu

Značajka

naprijed_list

popis

Vrsta povezanog popisa

Pojedinačno povezani popis

Dvostruko povezani popis

Prelazak

Može samo krenuti naprijed

Može preći i naprijed i unatrag

Upotreba pamćenja

Koristi manje memorije (samo jedan pokazivač po čvoru)

Koristi više memorije (dva pokazivača po čvoru)

Umetanje/brisanje

Brzo umetanje i brisanje, ali samo na ili nakon određenog položaja

Brzo umetanje i brisanje bilo gdje (prije ili nakon položaja)

Podržane funkcije

Ograničeno u usporedbi s popisom (bez veličine () Nema obrnutog iteratora)

Potpunije sučelje, uključujući veličinu () reverse () dvosmjerni iteratori.