Seznam v C ++ STL

Naprej_list vsebnik zagotavlja izvajanje Singly povezan seznam struktura podatkov. Shrani podatke v neprekinjenem pomnilniku, kjer vsak element kaže na naslednji element v zaporedju. Zaradi tega je vstavljanje in brisanje hitreje, ko je znan položaj elementa.

Sintaksa

Seznam naprej je opredeljen kot std :: Forward_list predloga razreda znotraj < naprej_list > datoteka glave.

naprej_list fl;

Kje

  • T: Vrsta podatkov Elementi na seznamu naprej.
  • F: Ime, dodeljeno na seznamu naprej.

Deklaracija in inicializacija

Napadalec je mogoče razglasiti in inicializirati na več načinov, kot je prikazano v spodnjem primeru:

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

Izhod
4 4 4 1 5 3 4  

Primer: V zgornjem programu smo preprost inicializirani seznam naprej na tri načine:

  • Izjava naprej_list Fl1 Ustvari prazen seznam številnih števil.
  • Izjava naprej_list FL2 (34) Ustvari seznam spredaj velikosti 3, vsak element pa 4.
  • Izjava naprej_list fl3 = {1 5 3 4} Ustvari seznam naprej in se inicializira z elementi, ki tvorijo seznam inicializatorja.

Osnovne operacije

Tu so osnovne operacije, ki jih lahko izvajamo na seznamu naprej:

1. dostop do elementov

Elementov seznama naprej ni mogoče dostopati z indeksi, kot so nizi ali vektorji. Za dostop do njega moramo zaporedno iti skozi seznam od začetka do želenega položaja. To je mogoče storiti s povečanjem začeti () iterator, vendar je bolje uporabiti naslednji () ali vnaprej () delovanje.

Vendar lahko do prvega elementa seznama enostavno dostopate FRONT () metoda.

Primer:

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

Izhod
1 3 

Primer: V zgornjem programu je prvi element natisnjen z uporabo FRONT () metoda. Za dostop do tretjega elementa naslednji () se uporablja za premikanje iteratorja dva položaja od začetka in *to se uporablja za odstranjevanje iteratorja.

2. Vstavljanje elementov

Elemente lahko vstavite na seznam naprej s pomočjo uporabe INSERT_AFTER () delovanje. Zahteva iterator, po katerem je treba vstaviti element. Vendar hitro vstavljanje spredaj podpira push_front () metoda.

Primer:

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

Izhod
1 5 3 4  

Pojasnilo: V tem programu se spredaj vstavi prvi element naprej_lista s pomočjo push_front () delovanje. Nato se ustvari iterator in premakne en položaj naprej s pomočjo vnaprej () delovanje. Po tem element 5 je vstavljen po drugem elementu z uporabo INSERT_AFTER () delovanje.

3. Posodabljanje elementov

Vrednost obstoječih elementov je mogoče preprosto spremeniti z dostopom do njih in z uporabo Operater dodelitve za dodelitev nove vrednosti.

Primer:

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

Izhod
111 333 

4. Iskanje elementa

Seznam naprej ne zagotavlja nobene funkcije člana za iskanje elementa, lahko pa uporabimo find () algoritem za iskanje katere koli vrednosti.

Primer :

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

Izhod
3 

5. Traversing

Seznam naprej je mogoče prečkati s pomočjo začeti () in konec () Iteratorji z zanko, vendar se lahko samo premaknemo naprej in ne nazaj.

Primer:

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

Izhod
1 5 3 4  

6. Brisanje elementov

Na seznamu naprej lahko element na danem položaju izbrišemo s pomočjo erase_after () metoda. Ta metoda popelje iterator v en položaj pred ciljnim elementom. Hitro brisanje spredaj je mogoče z uporabo pop_front () metoda.

Primer:

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

Izhod
5 3  

7. Velikost seznama naprej

Forward_list nima vgrajene funkcije velikosti (). Če želite najti svojo velikost, moramo ročno prešteti elemente tako, da jih prečkamo z zanko ali z razdaljo 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  ;   }   

Izhod
Size of forward_list: 4  

8. prazno ()

Uporablja se za preverjanje, ali je naprej_list prazen.
Vrne resnično, če je seznam prazen in napačen, sicer pa omogoča hitro preverjanje, če vsebnik nima podatkov.

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

Izhod
The forward_list is empty. The forward_list is not empty.  

Časovna zapletenost

Spodnja tabela navaja časovno zapletenost zgornjih operacij na seznamu naprej:

Delovanje Časovna zapletenost
Dostop do prvega elementa O (1)
Dostop n th element O (n)
Vstavite spredaj O (1)
Vstavite po določenem položaju O (n)
Izbriši prvi element O (1)
Izbrišite po določenem položaju O (n)
Traversal O (n)

Seznam naprej v primerjavi s seznamom

Značilnost

naprej_list

seznam

Vrsta povezanega seznama

Singly povezan seznam

Dvojno povezan seznam

Traversal

Lahko samo prečkate naprej

Lahko prečka tako naprej kot nazaj

Uporaba pomnilnika

Uporablja manj pomnilnika (samo en kazalec na vozlišče)

Uporablja več pomnilnika (dva kazalca na vozlišče)

Vstavljanje/brisanje

Hitro vstavljanje in brisanje, vendar le ob določenem položaju ali po njem

Hitro vstavljanje in brisanje kjer koli (pred ali po položaju)

Funkcije podprte

Omejeno v primerjavi s seznamom (brez velikosti () brez povratnih iteratorjev)

Popolnejši vmesnik, vključno z velikostjo () reverzni () dvosmerni iteratorji.