logo

Lista înainte în C ++ STL

Forward_list Containerul oferă implementarea Lista singuri legată Structura de date. Stochează date în memorie necontigue, unde fiecare element indică următorul element din secvență. Acest lucru face ca introducerea și ștergerea mai rapidă odată ce poziția elementului este cunoscută.

Sintaxă

Lista de înaintare este definită ca STD :: Forward_list șablon de clasă în interiorul< Forward_list > Fișier antet.



Forward_listFL;

unde

  • T: Tipul de date de elemente din lista înainte.
  • F: Numele atribuit listei de înaintare.

Declarație și inițializare

O listă forward_ poate fi declarată și inițializată în mai multe moduri, așa cum se arată în exemplul de mai jos:



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

Ieșire
4 4 4 1 5 3 4 

Exemplu: În programul de mai sus, suntem simpli lista inițializată inițial în trei moduri:

  • Declaraţie Forward_list FL1 Creează o listă goală de numere întregi.
  • Declaraţie Forward_list FL2 (34) Creează o listă înainte cu dimensiunea 3 și fiecare element fiind 4.
  • Declaraţie Forward_list fl3 = {1 5 3 4} Creează o listă înainte și inițializează cu elementele formează lista inițializantă.

Operații de bază

Iată operațiunile de bază pe care le putem efectua pe o listă înainte:

1. Accesarea elementelor

Elementele listei înainte nu pot fi accesate folosind indici precum tablouri sau vectori. Trebuie să parcurgem secvențial lista de la început până la poziția dorită pentru a o accesa. Acest lucru se poate face prin creșterea ÎNCEPE() iterator, dar este mai bine să folosești Următorul() sau avans() funcţie.



Cu toate acestea, primul element al listei poate fi accesat cu ușurință faţă() metodă.

Exemplu:

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

Ieșire
1 3

Exemplu: În programul de mai sus, primul element este tipărit folosind faţă() metodă. Pentru a accesa al treilea element Următorul() se folosește pentru a muta iteratorul două poziții de la început și *it este folosit pentru a dereferenta iteratorul.

2. Introducerea elementelor

Elementele pot fi introduse în lista înainte folosind insert_after () funcţie. Necesită iteratorul după care elementul trebuie introdus. Oricât de rapidă este susținută inserția rapidă în față push_front () metodă.

Exemplu:

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

Ieșire
1 5 3 4 

Explicaţie: În acest program, primul element al listei forward_list este introdus în față folosind push_front () funcţie. Apoi un iterator este creat și mutat o poziție înainte folosind avans() funcţie. După aceea elementul 5 este introdus după al doilea element folosind insert_after () funcţie.

3. Actualizarea elementelor

Valoarea elementelor existente poate fi modificată pur și simplu prin accesarea acestora și folosind operator de atribuire Pentru a atribui noua valoare.

Exemplu:

logica de transfer de înregistrări
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; } 

Ieșire
111 333

4. Element de găsire

Lista de înaintare nu oferă nicio funcție de membru pentru a căuta un element, dar putem folosi găsi() algoritm pentru a găsi orice valoare dată.

Exemplu :

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

Ieșire
3

5. Traversare

O listă înainte poate fi traversată folosind ÎNCEPE() şi Sfârşit() Iteratoare cu o buclă, dar putem merge doar înainte și nu înapoi.

Exemplu:

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

Ieșire
1 5 3 4 

6. Ștergerea elementelor

În lista înainte putem șterge elementul în poziția dată folosind erase_after () metodă. Această metodă duce iteratorul într -o poziție înainte de elementul țintă. Ștergerea rapidă din față este posibilă folosind pop_front () metodă.

Exemplu:

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

Ieșire
5 3 

7. Mărimea listei înainte

Forward_list nu are o funcție de mărime () încorporată. Pentru a -și găsi dimensiunea, trebuie să numărăm manual elementele traversând -o cu o buclă sau folosind distanța std ::.

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

Ieșire
Size of forward_list: 4 

8. Gol ()

Este folosit pentru a verifica dacă lista înainte_ este goală.
Returnează adevărat dacă lista este goală și falsă, altfel, permițând să verifice rapid dacă containerul nu are date.

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

Ieșire
The forward_list is empty. The forward_list is not empty. 

Complexitatea timpului

Tabelul de mai jos listează complexitatea de timp a operațiunilor de mai sus pe lista înainte:

Operație Complexitatea timpului
Accesați primul element O (1)
Acces nThelement Pe)
Introduceți în față O (1)
Introduceți după o poziție specifică Pe)
Ștergeți primul element O (1)
Ștergeți după o poziție specifică Pe)
Traversal Pe)

Lista de avansare vs lista

Caracteristică

Forward_list

listă

Tipul listei legate

Lista singuri legată

Lista dublă legată

Traversal

Poate traversa doar înainte

Poate traversa atât înainte, cât și înapoi

Utilizarea memoriei

Utilizează mai puțină memorie (un singur indicator pe nod)

Utilizează mai multă memorie (două indicatoare pe nod)

Inserție/ștergere

Inserție și ștergere rapidă, dar numai la sau după o anumită poziție

Inserție și ștergere rapidă oriunde (înainte sau după o poziție)

Funcții acceptate

Limitat în comparație cu lista (fără dimensiuni () fără iteratori inversi)

Interfață mai completă, inclusiv iteratoare bidirecționale Size () Reverse ().