Weiterleitungsliste in C++ STL

Forward_list Container stellt die Implementierung von bereit einfach verknüpfte Liste Datenstruktur. Es speichert Daten im nicht zusammenhängenden Speicher, wobei jedes Element auf das nächste Element in der Sequenz zeigt. Dies beschleunigt das Einfügen und Löschen, sobald die Position des Elements bekannt ist.

Syntax

Weiterleitungsliste ist definiert als std::forward_list Klassenvorlage innerhalb der < vorwärts_liste > Header-Datei.

vorwärts_liste fl;

Wo

  • T: Datentyp der Elemente in der Vorwärtsliste.
  • F: Der der Weiterleitungsliste zugewiesene Name.

Deklaration und Initialisierung

Eine „forward_list“ kann auf verschiedene Arten deklariert und initialisiert werden, wie im folgenden Beispiel gezeigt:

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

Ausgabe
4 4 4 1 5 3 4  

Beispiel: Im obigen Programm initialisieren wir die Vorwärtsliste einfach auf drei Arten:

  • Stellungnahme vorwärts_liste FL1 Erstellt eine leere Vorwärtsliste von Ganzzahlen.
  • Stellungnahme vorwärts_liste fl2(34) Erstellt eine Vorwärtsliste der Größe 3 und jedes Element ist 4.
  • Stellungnahme vorwärts_liste fl3 = {1 5 3 4} erstellt eine Vorwärtsliste und initialisiert mit den Elementen aus der Initialisierungsliste.

Grundlegende Operationen

Hier sind die grundlegenden Operationen, die wir für eine Weiterleitungsliste ausführen können:

1. Auf Elemente zugreifen

Auf die Elemente der Vorwärtsliste kann nicht über Indizes wie Arrays oder Vektoren zugegriffen werden. Wir müssen die Liste der Reihe nach vom Anfang bis zur gewünschten Position durchgehen, um darauf zuzugreifen. Dies kann durch Inkrementieren erfolgen beginnen() Iterator, aber es ist besser zu verwenden nächste() oder Vorauszahlung() Funktion.

Auf das erste Element der Liste kann jedoch leicht zugegriffen werden Front() Verfahren.

Beispiel:

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

Ausgabe
1 3 

Beispiel: Im obigen Programm wird das erste Element mit gedruckt Front() Verfahren. Um auf das dritte Element zuzugreifen nächste() wird verwendet, um den Iterator um zwei Positionen vom Anfang zu verschieben und *Es wird verwendet, um den Iterator zu dereferenzieren.

2. Elemente einfügen

Elemente können mit in die Vorwärtsliste eingefügt werden insert_after() Funktion. Es benötigt den Iterator, nach dem das Element eingefügt werden soll. Allerdings wird das schnelle Einsetzen an der Vorderseite durch unterstützt push_front() Verfahren.

Beispiel:

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

Ausgabe
1 5 3 4  

Erläuterung: In diesem Programm wird das erste Element der Forward_list vorne mit eingefügt push_front() Funktion. Dann wird ein Iterator erstellt und mit dem um eine Position nach vorne verschoben Vorauszahlung() Funktion. Danach das Element 5 wird nach dem zweiten Element mit eingefügt insert_after() Funktion.

3. Elemente aktualisieren

Der Wert vorhandener Elemente kann einfach durch Zugriff und Verwendung geändert werden Zuweisungsoperator um den neuen Wert zuzuweisen.

Beispiel:

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

Ausgabe
111 333 

4. Element finden

Die Vorwärtsliste bietet keine Mitgliedsfunktion zum Suchen nach einem Element, wir können jedoch die verwenden finden() Algorithmus, um einen beliebigen Wert zu finden.

Beispiel :

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

Ausgabe
3 

5. Überqueren

Eine Vorwärtsliste kann mit durchlaufen werden beginnen() Und Ende() Iteratoren mit einer Schleife, aber wir können uns nur vorwärts und nicht rückwärts bewegen.

Beispiel:

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

Ausgabe
1 5 3 4  

6. Elemente löschen

In der Vorwärtsliste können wir das Element an der angegebenen Position mit löschen erase_after() Verfahren. Diese Methode bringt den Iterator an eine Position vor dem Zielelement. Ein schnelles Löschen von vorne ist mit möglich pop_front() Verfahren.

Beispiel:

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

Ausgabe
5 3  

7. Größe der Weiterleitungsliste

Forward_list verfügt nicht über eine integrierte size()-Funktion. Um seine Größe zu ermitteln, müssen wir die Elemente manuell zählen, indem wir es mit einer Schleife durchlaufen oder std::distanz verwenden.

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

Ausgabe
Size of forward_list: 4  

8. empty()

Es wird verwendet, um zu prüfen, ob die Forward_list leer ist.
Es gibt „true“ zurück, wenn die Liste leer ist, andernfalls „false“, sodass schnell überprüft werden kann, ob der Container keine Daten enthält.

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

Ausgabe
The forward_list is empty. The forward_list is not empty.  

Zeitkomplexität

In der folgenden Tabelle ist die zeitliche Komplexität der oben genannten Vorgänge in der Weiterleitungsliste aufgeführt:

Betrieb Zeitkomplexität
Greifen Sie auf das erste Element zu O(1)
Zugang Nr Th Element An)
Vorne einsetzen O(1)
Nach einer bestimmten Position einfügen An)
Erstes Element löschen O(1)
Nach einer bestimmten Position löschen An)
Durchquerung An)

Weiterleitungsliste vs. Liste

Besonderheit

vorwärts_liste

Liste

Typ der verknüpften Liste

Einfach verknüpfte Liste

Doppelt verknüpfte Liste

Durchquerung

Kann nur vorwärts queren

Kann sowohl vorwärts als auch rückwärts fahren

Speichernutzung

Benötigt weniger Speicher (nur ein Zeiger pro Knoten)

Benötigt mehr Speicher (zwei Zeiger pro Knoten)

Einfügen/Löschen

Schnelles Einfügen und Löschen, jedoch nur an oder nach einer bestimmten Position

Schnelles Einfügen und Löschen überall (vor oder nach einer Position)

Unterstützte Funktionen

Begrenzt im Vergleich zur Liste (keine size(), keine Reverse-Iteratoren)

Vollständigere Schnittstelle einschließlich bidirektionaler Size()-Reverse()-Iteratoren.