logo

Elenco di inoltro in C++ STL

Elenco_inoltro contenitore fornisce l'implementazione di elenco collegato singolarmente struttura dei dati. Memorizza i dati in una memoria non contigua in cui ciascun elemento punta all'elemento successivo nella sequenza. Ciò rende più veloce l'inserimento e la cancellazione una volta nota la posizione dell'elemento.

Sintassi

L'elenco di inoltro è definito come std::forward_list modello di classe all'interno del file< forward_list >file di intestazione.



forward_listfl;

Dove

  • T: Tipo di dati degli elementi nell'elenco di inoltro.
  • F: Nome assegnato all'elenco di inoltro.

Dichiarazione e inizializzazione

Una forward_list può essere dichiarata e inizializzata in diversi modi, come mostrato nell'esempio seguente:



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

Produzione
4 4 4 1 5 3 4 

Esempio: Nel programma sopra abbiamo una semplice lista di inoltro inizializzata in tre modi:

  • Dichiarazione forward_list FL1 crea un elenco di inoltro vuoto di numeri interi.
  • Dichiarazione forward_list fl2(34) crea un elenco in avanti di dimensione 3 e con ogni elemento pari a 4.
  • Dichiarazione forward_list fl3 = {1 5 3 4} crea un elenco di inoltro e inizializza con gli elementi dell'elenco di inizializzatori.

Operazioni di base

Ecco le operazioni di base che possiamo eseguire su una lista di inoltro:

1. Accesso agli elementi

Non è possibile accedere agli elementi dell'elenco in avanti utilizzando indici come array o vettori. Dobbiamo scorrere l'elenco in sequenza dall'inizio alla posizione desiderata per accedervi. Questo può essere fatto incrementando inizio() iteratore ma è meglio usarlo Prossimo() O anticipo() funzione.



Tuttavia è possibile accedere facilmente al primo elemento dell'elenco tramite anteriore() metodo.

Esempio:

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

Produzione
1 3

Esempio: Nel programma sopra riportato il primo elemento viene stampato utilizzando anteriore() metodo. Per accedere al terzo elemento Prossimo() viene utilizzato per spostare l'iteratore di due posizioni dall'inizio e *Esso viene utilizzato per dereferenziare l'iteratore.

2. Inserimento di elementi

Gli elementi possono essere inseriti nell'elenco in avanti utilizzando inserisci_dopo() funzione. Richiede l'iteratore dopo il quale inserire l'elemento. Tuttavia l'inserimento rapido nella parte anteriore è supportato da push_front() metodo.

Esempio:

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

Produzione
1 5 3 4 

Spiegazione: In questo programma il primo elemento di forward_list viene inserito in primo piano utilizzando il push_front() funzione. Quindi viene creato un iteratore e spostato in avanti di una posizione utilizzando il comando anticipo() funzione. Dopodiché l'elemento 5 viene inserito dopo il secondo elemento utilizzando il inserisci_dopo() funzione.

3. Aggiornamento degli elementi

Il valore degli elementi esistenti può essere modificato semplicemente accedendovi e utilizzando operatore di assegnazione per assegnare il nuovo valore.

Esempio:

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

Produzione
111 333

4. Trovare l'elemento

L'elenco di inoltro non fornisce alcuna funzione membro per cercare un elemento ma possiamo usare il file Trovare() algoritmo per trovare un dato valore.

cos'è il modulo in c++

Esempio :

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

Produzione
3

5. Attraversamento

È possibile attraversare un elenco di inoltro utilizzando inizio() E FINE() iteratori con un ciclo ma possiamo solo andare avanti e non indietro.

Esempio:

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

Produzione
1 5 3 4 

6. Eliminazione di elementi

Nell'elenco in avanti possiamo eliminare l'elemento nella posizione specificata utilizzando cancella_dopo() metodo. Questo metodo porta l'iteratore in una posizione prima dell'elemento di destinazione. È possibile utilizzare la cancellazione rapida dalla parte anteriore pop_front() metodo.

Esempio:

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

Produzione
5 3 

7. Dimensioni dell'elenco di inoltro

forward_list non ha una funzione size() incorporata. Per trovare la sua dimensione dobbiamo contare manualmente gli elementi attraversandolo con un loop o utilizzando std:: distance.

C++
#include    #include  #include    using namespace std; int main() {  forward_list<int> flist={10203040};  //Calculate size by counting elements using std:: distance  int size=distance(flist.begin()flist.end());  cout<<'Size of forward_list: '<<size<<endl;  return 0; } 

Produzione
Size of forward_list: 4 

8. vuoto()

Viene utilizzato per verificare se forward_list è vuoto.
Restituisce true se la lista è vuota e false altrimenti permette di verificare velocemente se il contenitore non ha dati.

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

Produzione
The forward_list is empty. The forward_list is not empty. 

Complessità temporale

La tabella seguente elenca la complessità temporale delle operazioni di cui sopra nell'elenco di inoltro:

Operazione Complessità temporale
Accedi al primo elemento O(1)
Accesso nthelemento SU)
Inserto sul davanti O(1)
Inserisci dopo la posizione specifica SU)
Elimina il primo elemento O(1)
Elimina dopo una posizione specifica SU)
Traversata SU)

Elenco inoltro vs Elenco

Caratteristica

forward_list

lista

Tipo di elenco collegato

Elenco collegato singolarmente

Elenco doppiamente collegato

Traversata

Può solo andare avanti

elenco del lattice

Può spostarsi sia in avanti che all'indietro

Utilizzo della memoria

Utilizza meno memoria (solo un puntatore per nodo)

Utilizza più memoria (due puntatori per nodo)

Inserimento/Cancellazione

Inserimento ed eliminazione rapidi ma solo in corrispondenza o dopo una determinata posizione

Inserimento e cancellazione rapidi ovunque (prima o dopo una posizione)

Funzioni supportate

Limitato rispetto all'elenco (nessuna dimensione () senza iteratori inversi)

Interfaccia più completa che include iteratori bidirezionali size() reverse().