std::liste ind C++ med Eksempel

Hvad er en std::list?

In C++, refererer std::listen til en lagerbeholder. Std:listen giver dig mulighed for at indsรฆtte og fjerne elementer hvor som helst. Std::listen er implementeret som en dobbelt-linket liste. Dette 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.

Hvorfor bruge std::list?

Her er grundene til at bruge std::List:

  • Std::listen kan bedre sammenlignes med andre sekvensbeholdere som array og vektor.
  • De har en bedre ydeevne til at indsรฆtte, flytte og udtrรฆkke elementer fra enhver position.
  • Std::listen klarer sig ogsรฅ bedre med algoritmer, der udfรธrer sรฅdanne operationer intensivt.

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 โ€‹โ€‹indeholdt element. Du kan erstatte T med enhver datatype, selv brugerdefinerede typer.
  • Alloc โ€“ Definerer typen af โ€‹โ€‹allokeringsobjektet. Dette bruger som standard allocatorklasseskabelonen. Den er vรฆrdiafhรฆngig og bruger en simpel hukommelsesallokeringsmodel.

Eksempler 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:

std::liste

Her er et skรฆrmbillede af koden:

std::liste

Kodeforklaring:

  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 en for-lรธkke til at oprette en lรธkkevariabel x. Denne variabel vil blive brugt til at iterere over listeelementerne.
  7. Udskriv vรฆrdierne af listen pรฅ konsollen.
  8. Slutningen af โ€‹โ€‹kroppen af til lรธkke.
  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:

liste konstruktรธrer

Her er et skรฆrmbillede af koden:

liste konstruktรธrer

Kodeforklaring:

  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, som 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:

Indsรฆttelse i en liste

Her er et skรฆrmbillede af koden:

Indsรฆttelse i en liste

Kodeforklaring:

  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().

Sletning fra en liste

Det er muligt at slette elementer fra en liste. Erase()-funktionen giver dig mulighed for at slette et element eller en rรฆkke elementer fra en liste.

  • For at slette et enkelt element passerer du blot en heltalsposition. Varen vil blive slettet.
  • For at slette et omrรฅde skal du videregive 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:

Sletning fra en liste

Her er et skรฆrmbillede af koden:

Sletning fra en liste

Kodeforklaring:

  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().

Resumรฉ

  • std::listen er en lagerbeholder.
  • Det tillader indsรฆttelse og sletning af elementer fra hvor som helst pรฅ konstant tid.
  • Det er implementeret som et dobbelt-link
  • Std::list data kan tilgรฅs tovejs og sekventielt.
  • std::list understรธtter ikke hurtig tilfรฆldig adgang. Det understรธtter dog sekventiel adgang fra alle retninger.
  • Du kan sprede listeelementer af std::list i forskellige hukommelsesbidder.
  • Du kan formindske eller udvide std::list fra begge ender efter behov under kรธrsel.
  • For at indsรฆtte elementer i std::list, bruger vi funktionen insert().
  • For at slette elementer fra std::listen bruger vi erase()-funktionen.

Opsummer dette indlรฆg med: