std::lista in C++ med exempel

โšก Smart sammanfattning

std::lista in C++ รคr en sekvensbehรฅllare implementerad som en dubbellรคnkad lista, vilket mรถjliggรถr snabb infogning och borttagning var som helst samtidigt som element lagras i icke-sammanhรคngande minne och stรถder dubbelriktad sekventiell รฅtkomst istรคllet fรถr slumpmรคssig รฅtkomst.

  • ๐Ÿ”— Dubbelt lรคnkad lista: Varje element behรฅller lรคnkar till sin fรถregรฅende och nรคsta nod, sรฅ std::list-data finns kvar i icke-sammanhรคngande minne.
  • โšก Snabb infogning och borttagning: Att lรคgga till eller ta bort ett element vid en kรคnd position รคr konstant tid, till skillnad frรฅn en vektor som fรถrskjuter element.
  • ???? Ingen slumpmรคssig รฅtkomst: Element nรฅs genom sekventiell genomgรฅng frรฅn bรฅda รคndar, sรฅ indexering som list[3] รคr inte tillgรคnglig.
  • ๐Ÿงฉ Konstruktรถrer: Konstruktorerna standard, fill, range, copy, move och initializer-list bygger en std::list pรฅ olika sรคtt.
  • ๐Ÿ› ๏ธ Medlemsfunktioner: push_front(), push_back(), insert(), erase(), size(), reverse() och merge() hanterar listinnehรฅllet.
  • ๐Ÿค– AI-hjรคlp: GitHub Copilot och liknande assistenter scaffoldar std::list-deklarationer, iteratorer och infogar eller raderar logik frรฅn en kort kommentar.

std::lista in C++

Vad รคr en std::list?

In C++, std::list hรคnvisar till en lagringsbehรฅllare. std::list lรฅter dig infoga och ta bort objekt var som helst. std::list รคr implementerad som en dubbellรคnkad lista. Detta innebรคr att listdata kan nรฅs dubbelriktat och sekventiellt.

Standardmallbibliotekslistan stรถder inte snabb slumpmรคssig รฅtkomst, men den stรถder sekventiell รฅtkomst frรฅn alla riktningar.

Du kan sprida listelement i olika minnesbitar. Den information som behรถvs fรถr sekventiell รฅtkomst till data lagras i en container. Std::listan kan expandera och krympa frรฅn bรฅda รคndarna efter behov under kรถrning. En intern allokator uppfyller automatiskt lagringskraven.

Dessa egenskaper vรคcker en praktisk frรฅga: nรคr ska man egentligen ta fram en lista?

Varfรถr anvรคnda std::list?

Hรคr รคr anledningarna till att anvรคnda std::list:

  • std::list presterar bรคttre jรคmfรถrt med andra sekvensbehรฅllare som array och vector.
  • De har bรคttre prestanda vid insรคttning, fรถrflyttning och extracelement frรฅn vilken position som helst.
  • Std::listan fungerar ocksรฅ bรคttre med algoritmer som utfรถr sรฅdana operationer intensivt.

Med skรคlen tydliga รคr nรคsta steg syntaxen som deklarerar en.

Lista syntax

Fรถr att definiera std::listan mรฅste vi importera header-fil. Hรคr รคr syntaxen fรถr std::list definition:

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

Hรคr รคr en beskrivning av ovanstรฅende parametrar:

  • T โ€“ Definierar typen av element som ingรฅr. Du kan ersรคtta T med vilken datatyp som helst, รคven anvรคndardefinierade typer.
  • Alloc โ€“ Definierar typen av allocator-objekt. Detta anvรคnder allocator-klassmallen som standard. Det รคr vรคrdeberoende och anvรคnder en enkel minnesallokeringsmodell.

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

Produktion:

Utdata frรฅn exempel pรฅ skapande och iteration av std::list

Hรคr รคr en skรคrmdump av koden:

C++ kod som skapar en std::list och skriver ut den med en for-loop

Code Fรถrklaring:

  1. Inkludera algoritmhuvudfilen fรถr att anvรคnda dess funktioner.
  2. Inkludera iostream-huvudfilen fรถr att anvรคnda dess funktioner.
  3. Inkludera listhuvudfilen fรถr att anvรคnda dess funktioner.
  4. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  5. Skapa en lista med namnet my_list med en uppsรคttning av 4 heltal.
  6. Anvรคnd fรถr slinga fรถr att skapa en loopvariabel x. Denna variabel kommer att anvรคndas fรถr att iterera รถver listelementen.
  7. Skriv ut vรคrdena fรถr listan pรฅ konsolen.
  8. Slutet pรฅ kroppen av for-slingan.
  9. Slutet pรฅ huvuddelen av funktionen main().

C++ Lista funktioner

Hรคr รคr de vanliga std::listfunktionerna:

Funktion BESKRIVNING
Fรถra in() Denna funktion infogar ett nytt objekt fรถre den position som iteratorn pekar pรฅ.
trycka tillbaka() Denna funktion lรคgger till ett nytt objekt i slutet av listan.
push_front() Den lรคgger till ett nytt objekt lรคngst fram i listan.
pop_front() Det tar bort listans fรถrsta objekt.
storlek() Denna funktion bestรคmmer antalet listelement.
frรคmre() Fรถr att avgรถra listans fรถrsta poster.
tillbaka() Fรถr att avgรถra listans sista post.
omvรคnd() Det vรคnder pรฅ listobjekten.
sammanfoga() Den slรฅr samman tvรฅ sorterade listor.

Konstruktรถrer

Hรคr รคr listan รถver funktioner tillhandahรฅlls av header fil:

  • Standardkonstruktor std::list::list()- Den skapar en tom lista, det dรคr, med noll element.
  • Fill constructor std::list::list()- Den skapar en lista med n element och tilldelar ett vรคrde pรฅ noll (0) till varje element.
  • Range constructor std::list::list()- skapar en lista med mรฅnga element i intervallet fรถrst till sist.
  • Kopiera konstruktor std::list::list()- Den skapar en lista med en kopia av varje element som finns i den befintliga listan.
  • Move constructor std::list::list()- skapar en lista med elementen i en annan lista med hjรคlp av flyttsemantik.
  • Initializer list constructor std::list::list()-Den skapar en lista med elementen i en annan lista med hjรคlp av flyttsemantik.

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

Produktion:

Utdata frรฅn exempel pรฅ std::list-konstruktorer

Hรคr รคr en skรคrmdump av koden:

C++ kod som demonstrerar std::list default-, range- och move-konstruktorerna

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen fรถr att anvรคnda dess funktioner.
  2. Inkludera listhuvudfilen fรถr att anvรคnda dess funktioner.
  3. Inkludera std-namnomrรฅdet i koden fรถr att anvรคnda dess klasser utan att anropa det.
  4. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  5. Skapa en tom lista med namnet l.
  6. Skapa en lista med namnet l1 med en uppsรคttning av 3 heltal.
  7. Skapa en lista som heter l2 med alla element i listan som heter l1, frรฅn bรถrjan till slutet.
  8. Skapa en lista med namnet l3 med hjรคlp av rรถrelsesemantik. Listan l3 kommer att ha samma innehรฅll som listan l2.
  9. Skriv ut storleken pรฅ listan med namnet l pรฅ konsolen tillsammans med annan text.
  10. Skriv ut lite text pรฅ konsolen.
  11. Skapa en iterator som heter den och anvรคnd den fรถr att iterera รถver elementen i listan som heter l2.
  12. Skriv ut elementen i listan som heter l2 pรฅ konsolen.
  13. Skriv ut lite text pรฅ konsolen.
  14. Skapa en iterator som heter den och anvรคnd den fรถr att iterera รถver elementen i listan som heter l3.
  15. Skriv ut elementen i listan som heter l3 pรฅ konsolen.
  16. Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  17. Slutet pรฅ huvuddelen av funktionen main().

Behรฅllaregenskaper

Hรคr รคr listan รถver behรฅllaregenskaper:

Fast egendom BESKRIVNING
Sekvens Sekvensbehรฅllare ordnar sina element i en strikt linjรคr sekvens. Element nรฅs genom deras position i sekvensen.
Dubbellรคnkad lista Varje element har information om hur man lokaliserar fรถregรฅende och nรคsta element. Detta tillรฅter konstant tid fรถr insรคttning och radering.
Fรถrdelarmedveten Ett allokeringsobjekt anvรคnds fรถr att modifiera lagringsstorleken dynamiskt.

Infoga i en lista

Det finns olika funktioner som vi kan anvรคnda fรถr att infoga vรคrden i en lista. Lรฅt oss demonstrera detta:

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

Produktion:

Utdata efter att element har infogats i en std::list

Hรคr รคr en skรคrmdump av koden:

C++ kod med push_front, push_back och insert pรฅ en std::list

Code Fรถrklaring:

  1. Inkludera algoritmhuvudfilen fรถr att anvรคnda dess funktioner.
  2. Inkludera iostream-huvudfilen fรถr att anvรคnda dess funktioner.
  3. Inkludera listhuvudfilen fรถr att anvรคnda dess funktioner.
  4. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  5. Skapa en lista med namnet my_list med en uppsรคttning av 4 heltal.
  6. Infoga elementet 11 lรคngst fram i listan som heter my_list.
  7. Infoga element 18 i slutet av listan som heter my_list.
  8. Skapa en iterator och anvรคnd den fรถr att hitta elementet 10 frรฅn listan my_list.
  9. Anvรคnd en if-sats fรถr att avgรถra om elementet ovan hittades eller inte.
  10. Sรคtt in element 21 fรถre ovanstรฅende element om det hittades.
  11. Slutet pรฅ brรถdtexten i if-satsen.
  12. Anvรคnd en for-loop fรถr att skapa en loopvariabel x. Denna variabel kommer att anvรคndas fรถr att iterera รถver listelementen.
  13. Skriv ut vรคrdena fรถr listan pรฅ konsolen.
  14. ร„nden av kroppen fรถr en slinga.
  15. Slutet pรฅ huvuddelen av funktionen main().

Element som ska in i en lista kan lika gรคrna tas bort.

Ta bort frรฅn en lista

Det รคr mรถjligt att ta bort objekt frรฅn en lista. Funktionen erase() lรฅter dig ta bort ett objekt eller ett intervall av objekt frรฅn en lista.

  • Fรถr att radera ett enstaka objekt passerar du helt enkelt en heltalsposition. Objektet kommer att raderas.
  • Fรถr att ta bort ett intervall skickar du start- och slutiteratorerna. Lรฅt oss demonstrera detta.

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

Produktion:

Utdata efter att ett element tagits bort frรฅn en std::list

Hรคr รคr en skรคrmdump av koden:

C++ kod med hjรคlp av raderingsfunktionen pรฅ en std::list

Code Fรถrklaring:

  1. Inkludera algoritmhuvudfilen fรถr att anvรคnda dess funktioner.
  2. Inkludera iostream-huvudfilen fรถr att anvรคnda dess funktioner.
  3. Inkludera listhuvudfilen fรถr att anvรคnda dess funktioner.
  4. Inkludera std-namnutrymmet i vรฅrt program fรถr att anvรคnda dess klasser utan att anropa det.
  5. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  6. Skapa en lista med namnet my_list med en uppsรคttning av 4 heltal.
  7. Skriv ut lite text pรฅ konsolen.
  8. Anvรคnd en for-loop fรถr att skapa en loopvariabel x. Denna variabel kommer att anvรคndas fรถr att iterera รถver listelementen.
  9. Skriv ut vรคrdena fรถr listan pรฅ konsolen.
  10. Slutet pรฅ kroppen av for-slingan.
  11. Skapa en iterator i som pekar pรฅ det fรถrsta elementet i listan.
  12. Anvรคnd funktionen erase() som pekas av iteratorn i.
  13. Skriv ut lite text pรฅ konsolen.
  14. Anvรคnd en for-loop fรถr att skapa en loopvariabel x. Denna variabel kommer att anvรคndas fรถr att iterera รถver listelementen.
  15. Skriv ut vรคrdena fรถr listan pรฅ konsolen. Detta kommer efter radering.
  16. Slutet pรฅ kroppen av for-slingan.
  17. Programmet mรฅste returnera ett vรคrde efter framgรฅngsrikt slutfรถrande.
  18. Slutet pรฅ huvuddelen av funktionen main().

Vanliga frรฅgor

std::vector lagrar element i sammanhรคngande minne med O(1) slumpmรคssig รฅtkomst, medan std::list รคr en dubbellรคnkad lista som ger O(1) insรคttning eller borttagning var som helst. Vรคlj vektor fรถr indexering och lista fรถr frekventa mitteninsรคttningar.

Nej. std::list har ingen slumpmรคssig รฅtkomstoperator, sรฅ list[2] kompileras inte. Du nรฅr ett element genom att iterera frรฅn begin() eller end() en nod i taget, vilket kostar linjรคr O(n) tid fรถr en djup position.

std::list รคr en dubbellรคnkad lista som rรถr sig i bรฅda riktningarna och stรถder push_back. std::forward_list รคr en enkellรคnkad lista som bara rรถr sig framรฅt, anvรคnder mindre minne per nod och inte tillhandahรฅller nรฅgra size()- eller omvรคnda iteratorer.

Anropa medlemsfunktionen my_list.sort(), som kรถrs i ungefรคr N log N och hรฅller lika element stabila. Algoritmen std::sort fungerar inte eftersom den behรถver slumpmรคssiga iteratorer. Skicka std::greater till sort() fรถr fallande ordning.

Att infoga eller ta bort en nod รคr konstant O(1) tid nรคr du vรคl hรฅller en iterator pรฅ positionen, eftersom endast angrรคnsande pekare รคndras. Att hitta den positionen fรถrst genom traversering kostar fortfarande O(n) tid.

Ja. En std::list รคr inte en mรคngd, sรฅ den lagrar upprepade vรคrden fritt. Varje push_back, push_front eller insert lรคgger till en ny nod oavsett befintligt innehรฅll. Anvรคnd std::set nรคr du behรถver avvisa dubbletter.

Ja. GitHub Copilot skriver std::list-deklarationer, iteratorloopar och infogar eller raderar anrop frรฅn en kort kommentar eller ett funktionsnamn. Den fรถreslรฅr ofta std::vector nรคr sammanhรคngande lagring passar uppgiften bรคttre.

AI-kodningsassistenter autokompletterar STL-containerkod, flaggar felaktig iteratoranvรคndning, konverterar en std::list till en std::vector och fรถrklarar komplexitetsavvรคgningar. De snabbar upp inlรคrningen av STL:n, รคven om varje fรถrslag fortfarande behรถver granskas.

Sammanfatta detta inlรคgg med: