Előre lista a C ++ STL -ben

Előremeneti_list A Container biztosítja a Egyedül összekapcsolt lista adatszerkezet. Az adatokat nem kötött memóriában tárolja, ahol az egyes elemek a sorrend következő elemére mutatnak. Ez gyorsabbá teszi a beillesztést és a törlést, ha az elem helyzete ismert.

Szintaxis

Az előremenő lista meghatározva van STD :: Forward_list osztálysablon a < előremeneti_list > fejlécfájl.

előremeneti_list Fl;

ahol

  • T: Az elemek adattípusa az előző listában.
  • F: Az előző listához rendelt név.

Nyilatkozat és inicializálás

A Forward_list többféle módon deklarálható és inicializálható, az alábbi példában látható módon:

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

Kibocsátás
4 4 4 1 5 3 4  

Példa: A fenti programban háromféle módon egyszerűen inicializált előrejelző lista:

  • Nyilatkozat előremeneti_list Fl1 Készít egy üres előremenő számot az egész számokról.
  • Nyilatkozat előremeneti_list FL2 (34) Készít egy előretekintési listát a 3. méretről, és mindegyik elem 4.
  • Nyilatkozat előremeneti_list fl3 = {1 5 3 4} Készít egy előretekintő listát, és inicializálja az elemekkel az inicializáló listát.

Alapvető műveletek

Itt vannak az alapvető műveletek, amelyeket az előremenő listán végezhetünk:

1. Hozzáférés az elemekhez

Az előremenő lista elemei nem érhetők el olyan indexekkel, mint tömbök vagy vektorok. A hozzáféréshez a kezdetektől kezdve át kell mennünk a listán. Ezt megteheti a növekedéssel kezdődik() iterator, de jobb használni következő() vagy előleg() funkció.

A lista első eleme azonban könnyen hozzáférhető elülső() módszer.

Példa:

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

Kibocsátás
1 3 

Példa: A fenti programban az első elemet a használatával nyomtatják ki elülső() módszer. A harmadik elem eléréséhez következő() az iterátor két pozíciójának elejétől és a kezdetektől és *azt az iterátor megsemmisítésére használják.

2.

Az elemek beilleszthetők az előremeneti listába insert_after () funkció. Ez megköveteli azt az iterátort, amely után az elemet be kell helyezni. Bármennyire a fronton a gyors beillesztést támasztja alá push_front () módszer.

Példa:

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

Kibocsátás
1 5 3 4  

Magyarázat: Ebben a programba a Forward_list első eleme a push_front () funkció. Ezután létrehozzák egy iterátort, és egy pozíciót előre mozgatnak a előleg() funkció. Ezután az elem 5 a második elem után behelyezik a insert_after () funkció.

3. Az elemek frissítése

A meglévő elemek értéke egyszerűen megváltoztatható a hozzáféréssel és a használatával megbízó üzemeltető az új érték hozzárendeléséhez.

Példa:

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

Kibocsátás
111 333 

4. Elem megtalálása

Az előrejelző lista nem biztosít semmilyen tag funkciót egy elem kereséséhez, de használhatjuk a lelet() algoritmus az adott érték megtalálásához.

Példa :

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

Kibocsátás
3 

5. Traversing

Az előremenő lista áthaladhat a használatával kezdődik() és vége () iterátorok hurokkal, de csak előrehaladhatunk, és nem hátra.

Példa:

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

Kibocsátás
1 5 3 4  

6. Az elemek törlése

Az előző listában törölhetjük az elemet az adott helyzetben ERASE_AFTER () módszer. Ez a módszer az iterátort egy helyzetbe hozza a cél elem előtt. A gyors törlés az elülső oldalról lehetséges pop_front () módszer.

Példa:

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

Kibocsátás
5 3  

7. Az előrejelző lista mérete

A FORRED_LIST nem rendelkezik beépített méret () funkcióval. A méretének megtalálásához manuálisan kell számolnunk az elemeket úgy, hogy áthaladunk egy hurokkal vagy STD :: távolság használatával.

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

Kibocsátás
Size of forward_list: 4  

8. Üres ()

Arra használják, hogy ellenőrizze, hogy a Forward_list üres -e.
Igaz, ha a lista üres és hamis, egyébként lehetővé teszi, hogy gyorsan ellenőrizze, hogy a konténernek nincs -e adat.

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

Kibocsátás
The forward_list is empty. The forward_list is not empty.  

Idő bonyolultság

Az alábbi táblázat felsorolja a fenti műveletek időbeli bonyolultságát az előrejelző listán:

Művelet Idő bonyolultság
Hozzáférés az első elemhez O (1)
Hozzáférés n TH elem On)
Helyezze el az elejét O (1)
Helyezze be meghatározott helyzet után On)
Az első elem törlése O (1)
Törlés meghatározott helyzet után On)
Átjáró On)

Forward List VS Lista

Jellemző

előremeneti_list

lista

A kapcsolódó lista típusa

Egyedül összekapcsolt lista

Kétszeresen összekapcsolt lista

Átjáró

Csak előrehaladhat

Átjárhat mind előre, mind hátra

Memóriahasználat

Kevesebb memóriát használ (csomópontonként csak egy mutatót)

Több memóriát használ (csomópontonként két mutatót)

Beillesztés/törlés

Gyors beillesztés és törlés, de csak egy adott helyzetben vagy után

Gyors beillesztés és törlés bárhol (egy pozíció előtt vagy után)

Támogatott funkciók

Korlátozott a listához képest (nincs méret () nincs fordított iterátor)

Teljesebb interfész, beleértve a méret () fordított () kétirányú iterátorokat.