std::liste ind C++ med Eksempel

⚡ Smart opsummering

std::liste ind C++ er en sekvenscontainer implementeret som en dobbeltlænket liste, der muliggør hurtig indsættelse og sletning på enhver position, samtidig med at elementer lagres i ikke-sammenhængende hukommelse og understøtter tovejs sekventiel adgang i stedet for tilfældig adgang.

  • 🔗 Dobbelt linket liste: Hvert element bevarer links til sin forrige og næste node, så std::list-data findes i en ikke-sammenhængende hukommelse.
  • ⚡ Hurtig indsættelse og sletning: Tilføjelse eller fjernelse af et element på en kendt position er konstant tid, i modsætning til en vektor, der forskyder elementer.
  • 🚫 Ingen tilfældig adgang: Elementer nås ved sekventiel gennemgang fra begge ender, så indeksering som f.eks. list[3] er ikke tilgængelig.
  • 🧩 Konstruktører: Standard-, fill-, range-, copy-, move- og initializer-list-konstruktører opbygger en std::list på forskellige måder.
  • 🛠️ Medlemsfunktioner: push_front(), push_back(), insert(), erase(), size(), reverse() og merge() administrerer listeindholdet.
  • 🤖 AI assistance: GitHub Copilot og lignende assistenter scaffolder std::list-deklarationer, iteratorer og indsætter eller sletter logik fra en kort kommentar.

std::liste ind C++

Hvad er en std::list?

In C++, refererer std::list til en lagerbeholder. std::list giver dig mulighed for at indsætte og fjerne elementer fra hvor som helst. std::list er implementeret som en dobbeltlinket liste. Det betyder, at listedata kan tilgås tovejs og sekventielt.

Standardskabelonbibliotekslisten understøtter ikke hurtig tilfældig adgang, men den understøtter sekventiel adgang fra alle retninger.

Du kan sprede listeelementer i forskellige hukommelsesbidder. De nødvendige oplysninger til sekventiel adgang til data gemmes i en container. Std::listen kan udvides og krympes fra begge ender efter behov under kørsel. En intern allokator opfylder automatisk lagerkravene.

Disse træk rejser et praktisk spørgsmål: Hvornår skal man egentlig række ud efter en liste?

Hvorfor bruge std::list?

Her er grundene til at bruge std::list:

  • std::list klarer sig bedre sammenlignet med andre sekvenscontainere som array og vector.
  • De har en bedre ydeevne til at indsætte, flytte og udtrækketracelementer fra enhver position.
  • Std::listen klarer sig også bedre med algoritmer, der udfører sådanne operationer intensivt.

Med grundene klare, er det næste trin syntaksen, der erklærer en.

Liste syntaks

For at definere std::listen skal vi importere header-fil. Her er syntaksen for std::list definition:

template < class Type, class Alloc =allocator<T> > class list;

Her er en beskrivelse af ovenstående parametre:

  • T – Definerer typen af ​​element, der er indeholdt. Du kan erstatte T med enhver datatype, selv brugerdefinerede typer.
  • Alloc – Definerer typen af ​​allocator-objektet. Dette bruger som standard allocator-klasseskabelonen. Det er værdiafhængigt og bruger en simpel hukommelsesallokeringsmodel.

Eksempel 1

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };

	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

Output:

Output fra eksemplet på oprettelse og iteration af std::list

Her er et skærmbillede af koden:

C++ kode til at oprette en std::list og udskrive den med en for-løkke

Code Forklaring:

  1. Inkluder algoritmehovedfilen for at bruge dens funktioner.
  2. Inkluder iostream-header-filen for at bruge dens funktioner.
  3. Inkluder listehovedfilen for at bruge dens funktioner.
  4. Kald funktionen main(). Programlogikken skal tilføjes i denne funktions brødtekst.
  5. Opret en liste med navnet min_liste med et sæt på 4 heltal.
  6. Brug til løkke for at oprette en løkkevariabel x. Denne variabel vil blive brugt til at iterere hen over listeelementerne.
  7. Udskriv værdierne af listen på konsollen.
  8. Enden af ​​kroppen af ​​for-løkken.
  9. Slutningen af ​​hoveddelen af ​​funktionen main().

C++ Liste funktioner

Her er de almindelige std::list funktioner:

Funktion Beskrivelse
indsæt () Denne funktion indsætter et nyt element før den position, som iteratoren peger på.
skub tilbage() Denne funktion tilføjer et nyt element i slutningen af ​​listen.
push_front() Den tilføjer et nyt element foran på listen.
pop_front() Det sletter listens første punkt.
størrelse() Denne funktion bestemmer antallet af listeelementer.
foran() For at bestemme listens første punkter.
tilbage() For at bestemme listens sidste punkt.
baglæns() Det vender listepunkterne om.
fusionere() Den fletter to sorterede lister.

Konstruktører

Her er listen over funktioner leveret af header fil:

  • Standard konstruktør std::list::list()- Den opretter en tom liste, det, med nul elementer.
  • Fill constructor std::list::list()- Den opretter en liste med n elementer og tildeler en værdi på nul (0) til hvert element.
  • Range constructor std::list::list()- opretter en liste med mange elementer i området fra først til sidst.
  • Kopier konstruktør std::list::list()- Den opretter en liste med en kopi af hvert element indeholdt i den eksisterende liste.
  • Move constructor std::list::list()- opretter en liste med elementerne fra en anden liste ved hjælp af move semantik.
  • Initializer liste constructor std::list::list()-Den opretter en liste med elementerne fra en anden liste ved hjælp af move semantik.

Eksempel 2

#include <iostream>
#include <list>
using namespace std;
int main(void) {
	list<int> l;
	list<int> l1 = { 10, 20, 30 };
	list<int> l2(l1.begin(), l1.end());
	list<int> l3(move(l1));  
	cout << "Size of list l: " << l.size() << endl;
	cout << "List l2 contents: " << endl;
	for (auto it = l2.begin(); it != l2.end(); ++it)
	      cout << *it << endl;
	cout << "List l3 contents: " << endl;
	for (auto it = l3.begin(); it != l3.end(); ++it)
		cout << *it << endl;
	return 0;
}

Output:

Eksempel på output fra std::list-konstruktørerne

Her er et skærmbillede af koden:

C++ Kode der demonstrerer std::list default-, range- og move-konstruktørerne

Code Forklaring:

  1. Inkluder iostream-header-filen for at bruge dens funktioner.
  2. Inkluder listehovedfilen for at bruge dens funktioner.
  3. Inkluder std-navneområdet i koden for at bruge dets klasser uden at kalde det.
  4. Kald funktionen main(). Programlogikken skal tilføjes i denne funktions brødtekst.
  5. Opret en tom liste med navnet l.
  6. Opret en liste med navnet l1 med et sæt på 3 heltal.
  7. Opret en liste ved navn l2 med alle elementer i listen ved navn l1, fra begyndelsen til slutningen.
  8. Opret en liste med navnet l3 ved hjælp af move semantics. Listen l3 vil have samme indhold som listen l2.
  9. Udskriv størrelsen af ​​listen med navnet l på konsollen sammen med anden tekst.
  10. Udskriv noget tekst på konsollen.
  11. Opret en iterator ved navn det, og brug den til at iterere over elementerne på listen med navnet l2.
  12. Udskriv elementerne i listen med navnet l2 på konsollen.
  13. Udskriv noget tekst på konsollen.
  14. Opret en iterator ved navn det, og brug den til at iterere over elementerne på listen med navnet l3.
  15. Udskriv elementerne i listen med navnet l3 på konsollen.
  16. Programmet skal returnere værdi efter vellykket afslutning.
  17. Slutningen af ​​hoveddelen af ​​funktionen main().

Beholderegenskaber

Her er listen over containeregenskaber:

Ejendom Beskrivelse
Sequence Sekvensbeholdere bestiller deres elementer i en streng lineær rækkefølge. Elementer tilgås ved deres placering i sekvensen.
Dobbelt-linket liste Hvert element har information om, hvordan man finder tidligere og næste elementer. Dette giver mulighed for konstant tid til indsættelse og sletning.
Fordeler-bevidst Et allokeringsobjekt bruges til at ændre lagerstørrelsen dynamisk.

Indsættelse i en liste

Der er forskellige funktioner, vi kan bruge til at indsætte værdier i en liste. Lad os demonstrere dette:

Eksempel 3

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	my_list.push_front(11);
	my_list.push_back(18);
	auto it = std::find(my_list.begin(), my_list.end(), 10);
	if (it != my_list.end()) {
		my_list.insert(it, 21);
	}
	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

Output:

Output efter indsættelse af elementer i en std::list

Her er et skærmbillede af koden:

C++ kode ved hjælp af push_front, push_back og insert på en std::list

Code Forklaring:

  1. Inkluder algoritmehovedfilen for at bruge dens funktioner.
  2. Inkluder iostream-header-filen for at bruge dens funktioner.
  3. Inkluder listehovedfilen for at bruge dens funktioner.
  4. Kald funktionen main(). Programlogikken skal tilføjes i denne funktions brødtekst.
  5. Opret en liste med navnet min_liste med et sæt på 4 heltal.
  6. Indsæt element 11 foran på listen med navnet my_list.
  7. Indsæt element 18 til slutningen af ​​listen med navnet min_liste.
  8. Opret en iterator, og brug den til at finde elementet 10 fra listen my_list.
  9. Brug en if-sætning til at afgøre, om ovenstående element blev fundet eller ej.
  10. Indsæt element 21 før ovenstående element, hvis det blev fundet.
  11. Slutningen af ​​brødteksten i if-erklæringen.
  12. Brug en for-løkke til at oprette en løkkevariabel x. Denne variabel vil blive brugt til at iterere over listeelementerne.
  13. Udskriv værdierne af listen på konsollen.
  14. Enden af ​​kroppen af ​​for en løkke.
  15. Slutningen af ​​hoveddelen af ​​funktionen main().

Elementer, der skal på en liste, kan lige så nemt fjernes.

Sletning fra en liste

Det er muligt at slette elementer fra en liste. Funktionen erase() giver dig mulighed for at slette et element eller et interval af elementer fra en liste.

  • For at slette et enkelt element passerer du blot en heltalsposition. Varen vil blive slettet.
  • For at slette et interval, skal du bruge start- og slutiteratorerne. Lad os demonstrere dette.

Eksempel 4

#include <algorithm>
#include <iostream>
#include <list>
using namespace std;
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	cout << "List elements before deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	list<int>::iterator i = my_list.begin();
	my_list.erase(i);
	cout << "\nList elements after deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	return 0;
}

Output:

Output efter sletning af et element fra en std::list

Her er et skærmbillede af koden:

C++ kode ved hjælp af slettefunktionen på en std::list

Code Forklaring:

  1. Inkluder algoritmehovedfilen for at bruge dens funktioner.
  2. Inkluder iostream-header-filen for at bruge dens funktioner.
  3. Inkluder listehovedfilen for at bruge dens funktioner.
  4. Inkluder std-navneområdet i vores program for at bruge dets klasser uden at kalde det.
  5. Kald funktionen main(). Programlogikken skal tilføjes i denne funktions brødtekst.
  6. Opret en liste med navnet min_liste med et sæt på 4 heltal.
  7. Udskriv noget tekst på konsollen.
  8. Brug en for-løkke til at oprette en løkkevariabel x. Denne variabel vil blive brugt til at iterere over listeelementerne.
  9. Udskriv værdierne af listen på konsollen.
  10. Enden af ​​kroppen af ​​for-løkken.
  11. Opret en iterator i, der peger på det første element på listen.
  12. Brug funktionen erase() peget af iteratoren i.
  13. Udskriv noget tekst på konsollen.
  14. Brug en for-løkke til at oprette en løkkevariabel x. Denne variabel vil blive brugt til at iterere over listeelementerne.
  15. Udskriv værdierne af listen på konsollen. Dette kommer efter sletning.
  16. Enden af ​​kroppen af ​​for-løkken.
  17. Programmet skal returnere en værdi efter vellykket afslutning.
  18. Slutningen af ​​hoveddelen af ​​funktionen main().

Ofte Stillede Spørgsmål

std::vector gemmer elementer i sammenhængende hukommelse med O(1) tilfældig adgang, mens std::list er en dobbeltlænket liste, der giver O(1) indsættelse eller sletning hvor som helst. Vælg vektor til indeksering, og list til hyppige midterindsættelser.

Nej. std::list har ingen random access-operator, så list[2] kompilerer ikke. Du når et element ved at iterere fra begin() eller end() én node ad gangen, hvilket koster lineær O(n) tid for en dyb position.

std::list er en dobbeltlænket liste, der bevæger sig i begge retninger og understøtter push_back. std::forward_list er en enkeltlænket liste, der kun bevæger sig fremad, bruger mindre hukommelse pr. node og ikke tilbyder size() eller reverse iteratorer.

Kald medlemsfunktionen my_list.sort(), som kører i omkring N log N og holder lige elementer stabile. std::sort-algoritmen vil ikke fungere, fordi den kræver iteratorer med tilfældig adgang. Send std::greater til sort() for faldende rækkefølge.

Indsættelse eller sletning af en node er konstant O(1) tid, når du holder en iterator på positionen, fordi kun tilstødende pointere ændrer sig. At finde den position først ved traversering koster stadig O(n) tid.

Ja. En std::list er ikke et sæt, så den gemmer gentagne værdier frit. Hver push_back, push_front eller insert tilføjer en ny node uanset eksisterende indhold. Brug std::set, når du har brug for at afvise duplikerede elementer.

Ja. GitHub Copilot skriver std::list-deklarationer, iteratorløkker og indsætter eller sletter kald fra en kort kommentar eller et funktionsnavn. Den foreslår ofte std::vector, når sammenhængende lagring passer bedre til opgaven.

AI-kodningsassistenter autofuldfører STL-containerkode, markerer forkert iteratorbrug, konverterer en std::list til en std::vector og forklarer kompleksitetsafvejninger. De fremskynder indlæringen af ​​STL'en, selvom alle forslag stadig skal gennemgås.

Opsummer dette indlæg med: