std::liste inn C++ med eksempel

โšก Smart oppsummering

std::liste inn C++ er en sekvensbeholder implementert som en dobbeltlenket liste, som muliggjรธr rask innsetting og sletting pรฅ enhver posisjon samtidig som elementer lagres i ikke-sammenhengende minne og stรธtter toveis sekvensiell tilgang i stedet for tilfeldig tilgang.

  • ๐Ÿ”— Dobbeltlenket liste: Hvert element beholder koblinger til sin forrige og neste node, sรฅ std::list-data ligger i ikke-sammenhengende minne.
  • โšก Rask innsetting og sletting: ร… legge til eller fjerne et element pรฅ en kjent posisjon er konstant tid, i motsetning til en vektor som forskyver elementer.
  • ๐Ÿšซ Ingen tilfeldig tilgang: Elementer nรฅs ved sekvensiell gjennomgang fra begge ender, sรฅ indeksering som list[3] er ikke tilgjengelig.
  • ๐Ÿงฉ Konstruktรธrer: Standard-, fill-, range-, copy-, move- og initializer-list-konstruktรธrer bygger en std::list pรฅ forskjellige mรฅter.
  • ๐Ÿ› ๏ธ Medlemsfunksjoner: push_front(), push_back(), insert(), erase(), size(), reverse() og merge() administrerer listeinnholdet.
  • ๐Ÿค– AI-hjelp: GitHub Copilot og lignende assistenter scaffolder std::list-deklarasjoner, iteratorer og setter inn eller sletter logikk fra en kort kommentar.

std::liste inn C++

Hva er en std::list?

In C++, refererer std::list til en lagringsbeholder. std::list lar deg sette inn og fjerne elementer fra hvor som helst. std::list er implementert som en dobbeltlenket liste. Dette betyr at listedata kan nรฅs toveis og sekvensielt.

Standardmalbiblioteklisten stรธtter ikke rask tilfeldig tilgang, men den stรธtter sekvensiell tilgang fra alle retninger.

Du kan spre listeelementer i forskjellige minnebiter. Informasjonen som trengs for sekvensiell tilgang til data lagres i en beholder. Std::listen kan utvides og krympes fra begge ender etter behov under kjรธring. En intern allokator oppfyller automatisk lagringskravene.

Disse trekkene reiser et praktisk spรธrsmรฅl: nรฅr bรธr du egentlig ta en liste?

Hvorfor bruke std::list?

Her er grunnene til รฅ bruke std::list:

  • std::list gjรธr det bedre sammenlignet med andre sekvenscontainere som array og vector.
  • De har bedre ytelse nรฅr det gjelder รฅ sette inn, flytte og ekskluderetracelementer fra enhver posisjon.
  • Std::listen gjรธr det ogsรฅ bedre med algoritmer som utfรธrer slike operasjoner intensivt.

Med รฅrsakene klare, er neste trinn syntaksen som deklarerer en.

Liste syntaks

For รฅ definere std::listen, mรฅ vi importere header-fil. Her er std::list definisjonssyntaks:

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

Her er en beskrivelse av parameterne ovenfor:

  • T โ€“ Definerer elementtypen som inngรฅr. Du kan erstatte T med en hvilken som helst datatype, selv brukerdefinerte typer.
  • Alloc โ€“ Definerer typen allocator-objekt. Dette bruker allocator-klassemalen som standard. Det er verdiavhengig og bruker en enkel minneallokeringsmodell.

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

Utgang:

Utdata fra eksempelet pรฅ oppretting og iterasjon av std::list

Her er et skjermbilde av koden:

C++ kode som lager en std::list og skriver den ut med en for-lรธkke

Code Forklaring:

  1. Inkluder algoritmehodefilen for รฅ bruke funksjonene.
  2. Inkluder iostream-headerfilen for รฅ bruke funksjonene.
  3. Inkluder listeoverskriftsfilen for รฅ bruke funksjonene.
  4. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av denne funksjonen.
  5. Lag en liste kalt min_liste med et sett med 4 heltall.
  6. Bruk for slรธyfe for รฅ opprette en lรธkkevariabel x. Denne variabelen vil bli brukt til รฅ iterere over listeelementene.
  7. Skriv ut verdiene til listen pรฅ konsollen.
  8. Enden av kroppen til for-lรธkken.
  9. Slutten av hoveddelen av hoved()-funksjonen.

C++ Liste funksjoner

Her er de vanlige std::list-funksjonene:

Funksjon Tekniske beskrivelser
sett inn() Denne funksjonen setter inn et nytt element fรธr posisjonen iteratoren peker pรฅ.
push_back() Denne funksjonen legger til et nytt element pรฅ slutten av listen.
push_front() Den legger til et nytt element foran pรฅ listen.
pop_front() Det sletter listens fรธrste element.
stรธrrelse() Denne funksjonen bestemmer antall listeelementer.
front() For รฅ bestemme listens fรธrste elementer.
tilbake() For รฅ bestemme listens siste element.
omvendt() Det reverserer listeelementene.
slรฅ sammen() Den slรฅr sammen to sorterte lister.

Konstruktรธrer

Her er listen over funksjoner levert av header-fil:

  • Standard konstruktรธr std::list::list()- Den lager en tom liste, det, med null elementer.
  • Fyll konstruktรธr std::list::list()- Den lager en liste med n elementer og tildeler en verdi pรฅ null (0) til hvert element.
  • Omrรฅdekonstruktรธr std::list::list()- oppretter en liste med mange elementer i omrรฅdet fra fรธrst til sist.
  • Kopier konstruktรธr std::list::list()- Den lager en liste med en kopi av hvert element i den eksisterende listen.
  • Move constructor std::list::list()- oppretter en liste med elementene i en annen liste ved รฅ bruke flyttesemantikk.
  • Initialiseringsliste-konstruktรธr std::list::list()-Den lager en liste med elementene i en annen liste ved รฅ bruke flyttesemantikk.

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

Utgang:

Eksempel pรฅ utdata fra std::list-konstruktรธrene

Her er et skjermbilde av koden:

C++ kode som demonstrerer std::list default-, range- og move-konstruktรธrene

Code Forklaring:

  1. Inkluder iostream-headerfilen for รฅ bruke funksjonene.
  2. Inkluder listeoverskriftsfilen for รฅ bruke funksjonene.
  3. Inkluder std-navneomrรฅdet i koden for รฅ bruke klassene uten รฅ kalle det.
  4. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av denne funksjonen.
  5. Lag en tom liste med navnet l.
  6. Lag en liste med navnet l1 med et sett med 3 heltall.
  7. Lag en liste med navnet l2 med alle elementene i listen kalt l1, fra begynnelsen til slutten.
  8. Lag en liste med navnet l3 ved รฅ bruke bevegelsessemantikk. Listen l3 vil ha samme innhold som listen l2.
  9. Skriv ut stรธrrelsen pรฅ listen kalt l pรฅ konsollen sammen med annen tekst.
  10. Skriv ut litt tekst pรฅ konsollen.
  11. Lag en iterator som heter den og bruk den til รฅ iterere over elementene i listen som heter l2.
  12. Skriv ut elementene i listen som heter l2 pรฅ konsollen.
  13. Skriv ut litt tekst pรฅ konsollen.
  14. Lag en iterator som heter den og bruk den til รฅ iterere over elementene i listen som heter l3.
  15. Skriv ut elementene i listen som heter l3 pรฅ konsollen.
  16. Programmet mรฅ returnere verdi ved vellykket gjennomfรธring.
  17. Slutten av hoveddelen av hoved()-funksjonen.

Beholderegenskaper

Her er listen over beholderegenskaper:

Eiendom Tekniske beskrivelser
Sequence Sekvensbeholdere bestiller elementene sine i en streng lineรฆr sekvens. Elementer er tilgjengelige ved deres plassering i sekvensen.
Dobbeltlenket liste Hvert element har informasjon om hvordan du finner forrige og neste elementer. Dette gir konstant tid for innsetting og sletting.
Fordeler-bevisst Et allokeringsobjekt brukes til รฅ endre lagringsstรธrrelsen dynamisk.

Setter inn i en liste

Det finnes forskjellige funksjoner vi kan bruke for รฅ sette inn verdier i en liste. La oss 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';
	}
}

Utgang:

Utdata etter innsetting av elementer i en std::list

Her er et skjermbilde av koden:

C++ kode ved bruk av push_front, push_back og insert pรฅ en std::list

Code Forklaring:

  1. Inkluder algoritmehodefilen for รฅ bruke funksjonene.
  2. Inkluder iostream-headerfilen for รฅ bruke funksjonene.
  3. Inkluder listeoverskriftsfilen for รฅ bruke funksjonene.
  4. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av denne funksjonen.
  5. Lag en liste kalt min_liste med et sett med 4 heltall.
  6. Sett inn element 11 foran pรฅ listen som heter min_liste.
  7. Sett inn element 18 til slutten av listen som heter min_liste.
  8. Lag en iterator den og bruk den til รฅ finne element 10 fra listen my_list.
  9. Bruk en if-setning for รฅ finne ut om elementet ovenfor ble funnet eller ikke.
  10. Sett inn element 21 fรธr elementet ovenfor hvis det ble funnet.
  11. Slutten av brรธdteksten til if-setningen.
  12. Bruk en for-lรธkke for รฅ lage en lรธkkevariabel x. Denne variabelen vil bli brukt til รฅ iterere over listeelementene.
  13. Skriv ut verdiene til listen pรฅ konsollen.
  14. Enden av kroppen av for en lรธkke.
  15. Slutten av hoveddelen av hoved()-funksjonen.

Elementer som skal inn i en liste kan like gjerne tas ut.

Sletting fra en liste

Det er mulig รฅ slette elementer fra en liste. Funksjonen erase() lar deg slette et element eller et omrรฅde med elementer fra en liste.

  • For รฅ slette et enkelt element passerer du ganske enkelt รฉn heltallsposisjon. Elementet vil bli slettet.
  • For รฅ slette et omrรฅde, sender du start- og sluttiteratorene. La oss 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;
}

Utgang:

Utdata etter sletting av et element fra en std::list

Her er et skjermbilde av koden:

C++ kode ved hjelp av slettefunksjonen pรฅ en std::list

Code Forklaring:

  1. Inkluder algoritmehodefilen for รฅ bruke funksjonene.
  2. Inkluder iostream-headerfilen for รฅ bruke funksjonene.
  3. Inkluder listeoverskriftsfilen for รฅ bruke funksjonene.
  4. Inkluder std-navneomrรฅdet i programmet vรฅrt for รฅ bruke klassene uten รฅ kalle det.
  5. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av denne funksjonen.
  6. Lag en liste kalt min_liste med et sett med 4 heltall.
  7. Skriv ut litt tekst pรฅ konsollen.
  8. Bruk en for-lรธkke for รฅ lage en lรธkkevariabel x. Denne variabelen vil bli brukt til รฅ iterere over listeelementene.
  9. Skriv ut verdiene til listen pรฅ konsollen.
  10. Enden av kroppen til for-lรธkken.
  11. Lag en iterator i som peker til det fรธrste elementet i listen.
  12. Bruk erase()-funksjonen pekt av iteratoren i.
  13. Skriv ut litt tekst pรฅ konsollen.
  14. Bruk en for-lรธkke for รฅ lage en lรธkkevariabel x. Denne variabelen vil bli brukt til รฅ iterere over listeelementene.
  15. Skriv ut verdiene til listen pรฅ konsollen. Dette kommer etter sletting.
  16. Enden av kroppen til for-lรธkken.
  17. Programmet mรฅ returnere en verdi ved vellykket gjennomfรธring.
  18. Slutten av hoveddelen av hoved()-funksjonen.

Spรธrsmรฅl og svar

std::vector lagrer elementer i sammenhengende minne med O(1) tilfeldig tilgang, mens std::list er en dobbeltlenket liste som gir O(1) innsetting eller sletting hvor som helst. Velg vektor for indeksering, og list for hyppige midtre innsettinger.

Nei. std::list har ingen tilfeldig tilgangsoperator, sรฅ list[2] kompilerer ikke. Du nรฅr et element ved รฅ iterere fra begin() eller end() รฉn node om gangen, noe som koster lineรฆr O(n) tid for en dyp posisjon.

std::list er en dobbeltlenket liste som beveger seg i begge retninger og stรธtter push_back. std::forward_list er en enkeltlenket liste som bare beveger seg fremover, bruker mindre minne per node og ikke tilbyr size()- eller revers-iteratorer.

Kall medlemsfunksjonen my_list.sort(), som kjรธrer i omtrent N log N og holder like elementer stabile. std::sort-algoritmen vil ikke fungere fordi den trenger iteratorer med tilfeldig tilgang. Send std::greater til sort() for synkende rekkefรธlge.

ร… sette inn eller slette en node er konstant O(1) tid nรฅr du holder en iterator pรฅ posisjonen, fordi bare nabopekere endres. ร… finne den posisjonen fรธrst ved traversering koster fortsatt O(n) tid.

Ja. En std::list er ikke et sett, sรฅ den lagrer gjentatte verdier fritt. Hver push_back, push_front eller insert legger til en ny node uavhengig av eksisterende innhold. Bruk std::set nรฅr du trenger รฅ avvise dupliserte elementer.

Ja. GitHub Copilot skriver std::list-deklarasjoner, iteratorlรธkker og setter inn eller sletter kall fra en kort kommentar eller et funksjonsnavn. Den foreslรฅr ofte std::vector nรฅr sammenhengende lagring passer bedre til oppgaven.

AI-kodingsassistenter autofullfรธrer STL-containerkode, flagger feil iteratorbruk, konverterer en std::list til en std::vector og forklarer avveininger i kompleksitet. De fremskynder lรฆringen av STL-en, selv om alle forslag fortsatt mรฅ gjennomgรฅs.

Oppsummer dette innlegget med: