std::list in C++ esimerkin kanssa

โšก ร„lykรคs yhteenveto

std::list in C++ on kaksinkertaisesti linkitettynรค listana toteutettu sekvenssisรคiliรถ, joka mahdollistaa nopean lisรคyksen ja poiston missรค tahansa kohdassa tallentaen elementtejรค epรคjatkuvaan muistiin ja tukien kaksisuuntaista perรคkkรคistรค kรคyttรถรค satunnaisen kรคytรถn sijaan.

  • ๐Ÿ”— Kaksinkertaisesti linkitetty lista: Jokainen elementti sรคilyttรครค linkit edelliseen ja seuraavaan solmuunsa, joten std::list-data sijaitsee erillisessรค muistissa.
  • โšก Nopea lisรคys ja poisto: Elementin lisรครคminen tai poistaminen tunnetusta kohdasta on vakioaikaista, toisin kuin vektori, joka siirtรครค elementtejรค.
  • ๐Ÿšซ Ei satunnaista pรครคsyรค: Elementteihin pรครคstรครคn perรคkkรคisellรค lรคpikรคynnillรค kummastakin pรครคstรค, joten indeksointi, kuten list[3], ei ole kรคytettรคvissรค.
  • ๐Ÿงฉ Rakentajat: Default-, fill-, range-, copy-, move- ja initializer-list-konstruktorit rakentavat std::list-listin eri tavoin.
  • ๐Ÿ› ๏ธ Jรคsenten toiminnot: push_front(), push_back(), insert(), erase(), size(), reverse() ja merge() hallitsevat listan sisรคltรถรค.
  • ๐Ÿค– AI-apu: GitHub Copilot ja vastaavat avustajat tukevat std::list-mรครคrittelyjรค, iteraattoreita ja lisรครคvรคt tai poistavat logiikkaa lyhyestรค kommentista.

std::list in C++

Mikรค on std::list?

In C++, std::list viittaa tallennussรคiliรถรถn. std::list-luettelon avulla voit lisรคtรค ja poistaa kohteita mistรค tahansa. std::list on toteutettu kaksinkertaisesti linkitettynรค luettelona. Tรคmรค tarkoittaa, ettรค luettelotietoihin pรครคsee kรคsiksi kaksisuuntaisesti ja perรคkkรคin.

Vakiomallipohjakirjaston luettelo ei tue nopeaa satunnaista kรคyttรถรค, mutta se tukee perรคkkรคistรค kรคyttรถรค kaikista suunnista.

Voit sirottaa luetteloelementtejรค eri muistipaloihin. Tietojen perรคkkรคiseen kรคyttรถรถn tarvittavat tiedot tallennetaan sรคilรถรถn. Std::lista voi laajeta ja pienentyรค molemmista pรคistรค tarpeen mukaan ajon aikana. Sisรคinen allokaattori tรคyttรครค automaattisesti tallennusvaatimukset.

Nรคmรค piirteet herรคttรคvรคt kรคytรคnnรถn kysymyksen: milloin sinun oikeastaan โ€‹โ€‹pitรคisi tarttua listaan?

Miksi kรคyttรครค std::list?

Tรคssรค ovat syyt std::listin kรคyttรถรถn:

  • std::list toimii paremmin verrattuna muihin sekvenssikontteihin, kuten array ja vector.
  • Niillรค on parempi suorituskyky lisรคyksessรค, siirtรคmisessรค ja ulosviennissรคtracelementtien kรคsittelyรค mistรค tahansa asennosta.
  • Std::list toimii paremmin myรถs algoritmeilla, jotka suorittavat tรคllaisia โ€‹โ€‹toimintoja intensiivisesti.

Kun syyt ovat selvรคt, seuraava vaihe on syntaksi, joka deklaroi sellaisen.

Listaa syntaksi

Jotta voimme mรครคrittรครค std::list, meidรคn on tuotava otsikkotiedosto. Tรคssรค on std::list-mรครคrityksen syntaksi:

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

Tรคssรค on kuvaus yllรค olevista parametreista:

  • T โ€“ Mรครคrittรครค elementin tyypin. Voit korvata T:n millรค tahansa tietotyypillรค, jopa kรคyttรคjรคn mรครคrittรคmรคllรค tyypillรค.
  • Alloc โ€“ Mรครคrittรครค allokaattoriobjektin tyypin. Tรคmรค kรคyttรครค oletusarvoisesti allokaattoriluokkamallia. Se on arvosta riippuvainen ja kรคyttรครค yksinkertaista muistin allokointimallia.

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

lรคhtรถ:

std::list-listin luonti- ja iteraatioesimerkin tuloste

Tรคssรค on kuvakaappaus koodista:

C++ koodi, joka luo std::listin ja tulostaa sen for-silmukalla

Code Selitys:

  1. Sisรคllytรค algoritmin otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  2. Sisรคllytรค iostream-otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  3. Sisรคllytรค luettelon otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  4. Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisรคtรค tรคmรคn funktion runkoon.
  5. Luo lista nimeltรค oma_luettelo 4 kokonaislukujoukolla.
  6. Kรคyttรครค silmukalle luodaksesi silmukkamuuttujan x. Tรคtรค muuttujaa kรคytetรครคn listan alkioiden lรคpikรคymiseen.
  7. Tulosta luettelon arvot konsolissa.
  8. For-silmukan rungon loppu.
  9. Main()-funktion rungon loppu.

C++ Listaa toiminnot

Tรคssรค ovat yleiset std::list-toiminnot:

Toiminto Tuotetiedot
lisรครค () Tรคmรค toiminto lisรครค uuden kohteen ennen iteraattorin osoittamaa paikkaa.
tyรถnnรค takaisin() Tรคmรค toiminto lisรครค uuden kohteen luettelon loppuun.
push_front() Se lisรครค uuden kohteen luettelon eteen.
pop_front() Se poistaa luettelon ensimmรคisen kohteen.
koko() Tรคmรค toiminto mรครคrittรครค luettelon elementtien lukumรครคrรคn.
edessรค () Mรครคrittรครค luettelon ensimmรคiset kohteet.
takaisin() Mรครคrittรครค luettelon viimeisen kohteen.
kรครคnteinen() Se kรครคntรครค luettelon kohteet pรคinvastaiseksi.
yhdistรครค() Se yhdistรครค kaksi lajiteltua luetteloa.

Rakentajat

Tรคssรค on luettelo tehtรคvรคt tarjoaa otsikkotiedosto:

  • Oletuskonstruktori std::list::list()- Se luo tyhjรคn listan, jossa on nolla elementtiรค.
  • Fill constructor std::list::list()- Se luo luettelon, jossa on n elementtiรค ja antaa kullekin elementille arvon nolla (0).
  • Aluekonstruktori std::list::list()- luo luettelon, jossa on useita elementtejรค vรคlillรค ensimmรคisestรค viimeiseen.
  • Kopioi rakentaja std::list::list()- Se luo luettelon, jossa on kopio jokaisesta olemassa olevan luettelon sisรคltรคmรคstรค elementistรค.
  • Move constructor std::list::list()- luo listan toisen listan elementeistรค kรคyttรคmรคllรค siirtosemantiikkaa.
  • Initializer list constructor std::list::list()-Se luo listan toisen listan elementeistรค kรคyttรคmรคllรค siirtosemantiikkaa.

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

lรคhtรถ:

std::list-konstruktorien esimerkin tuloste

Tรคssรค on kuvakaappaus koodista:

C++ koodi, joka esittelee std::list default-, range- ja move-konstruktoreita

Code Selitys:

  1. Sisรคllytรค iostream-otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  2. Sisรคllytรค luettelon otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  3. Sisรคllytรค std-nimiavaruus koodiin, jotta voit kรคyttรครค sen luokkia kutsumatta sitรค.
  4. Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisรคtรค tรคmรคn funktion runkoon.
  5. Luo tyhjรค lista nimeltรค l.
  6. Luo lista nimeltรค l1, jossa on 3 kokonaislukua.
  7. Luo lista nimeltรค l2, jossa on kaikki listan l1 elementit alusta loppuun.
  8. Luo l3-niminen lista kรคyttรคmรคllรค siirtosemantiikkaa. Listalla l3 on sama sisรคltรถ kuin listalla l2.
  9. Tulosta l-nimisen luettelon koko konsoliin muun tekstin rinnalle.
  10. Tulosta tekstiรค konsoliin.
  11. Luo iteraattori nimeltรค se ja kรคytรค sitรค iteroitaessa listan l2 elementtejรค.
  12. Tulosta l2-nimisen luettelon elementit konsoliin.
  13. Tulosta tekstiรค konsoliin.
  14. Luo iteraattori nimeltรค se ja kรคytรค sitรค iteroitaessa listan l3 elementtejรค.
  15. Tulosta l3-nimisen luettelon elementit konsoliin.
  16. Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
  17. Main()-funktion rungon loppu.

Sรคilytysominaisuudet

Tรคssรค on luettelo sรคilรถn ominaisuuksista:

Omaisuus Tuotetiedot
Jรคrjestys Sekvenssisรคiliรถt jรคrjestรคvรคt elementit tiukassa lineaarisessa jรคrjestyksessรค. Elementteihin pรครคstรครคn niiden sijainnin perusteella sekvenssissรค.
Kaksoislinkitetty lista Jokaisella elementillรค on tietoa edellisten ja seuraavien elementtien paikantamisesta. Tรคmรค mahdollistaa jatkuvan ajan lisรคys- ja poistotoimenpiteille.
Alokaattoritietoinen Varaajan objektia kรคytetรครคn tallennuskoon dynaamiseen muokkaamiseen.

Lisรครคminen luetteloon

Listan arvojen lisรครคmiseen on olemassa erilaisia โ€‹โ€‹funktioita. Havainnollistetaanpa tรคtรค:

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

lรคhtรถ:

Tuloste elementtien lisรครคmisen jรคlkeen std::list-listaan

Tรคssรค on kuvakaappaus koodista:

C++ koodi kรคyttรคen push_front-, push_back- ja insert-metodeja std::list-listalle

Code Selitys:

  1. Sisรคllytรค algoritmin otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  2. Sisรคllytรค iostream-otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  3. Sisรคllytรค luettelon otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  4. Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisรคtรค tรคmรคn funktion runkoon.
  5. Luo lista nimeltรค oma_luettelo 4 kokonaislukujoukolla.
  6. Lisรครค elementti 11 listan "my_list" etupuolelle.
  7. Lisรครค elementti 18 listan loppuun, jonka nimi on my_list.
  8. Luo se iteraattori ja etsi sen avulla elementti 10 listasta my_list.
  9. Kรคytรค if-lausetta mรครคrittรครคksesi, lรถytyikรถ yllรค oleva elementti vai ei.
  10. Aseta elementti 21 ennen yllรค olevaa elementtiรค, jos se lรถytyi.
  11. if-lauseen rungon loppu.
  12. Kรคytรค for-silmukkaa luodaksesi silmukkamuuttujan x. Tรคtรค muuttujaa kรคytetรครคn iteroimaan luetteloelementtien yli.
  13. Tulosta luettelon arvot konsolissa.
  14. For-silmukan rungon loppu.
  15. Main()-funktion rungon loppu.

Listalle menevรคt elementit voidaan yhtรค helposti poistaa.

Poistaminen luettelosta

Listalta on mahdollista poistaa kohteita. Erase()-funktion avulla voit poistaa listalta kohteen tai useita kohteita.

  • Jos haluat poistaa yhden kohteen, annat vain yhden kokonaisluvun sijainnin. Kohde poistetaan.
  • Alueen poistamiseksi annat eteenpรคin aloitus- ja lopetus-iteraattorit. Havainnollistetaanpa tรคtรค.

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

lรคhtรถ:

Tuloste elementin poistamisen jรคlkeen std::list-lististรค

Tรคssรค on kuvakaappaus koodista:

C++ koodia std::list-listan erase-funktion avulla

Code Selitys:

  1. Sisรคllytรค algoritmin otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  2. Sisรคllytรค iostream-otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  3. Sisรคllytรค luettelon otsikkotiedosto kรคyttรครคksesi sen toimintoja.
  4. Sisรคllytรค std-nimiavaruus ohjelmaamme, jotta voit kรคyttรครค sen luokkia kutsumatta sitรค.
  5. Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisรคtรค tรคmรคn funktion runkoon.
  6. Luo lista nimeltรค oma_luettelo 4 kokonaislukujoukolla.
  7. Tulosta tekstiรค konsoliin.
  8. Kรคytรค for-silmukkaa luodaksesi silmukkamuuttujan x. Tรคtรค muuttujaa kรคytetรครคn iteroimaan luetteloelementtien yli.
  9. Tulosta luettelon arvot konsolissa.
  10. For-silmukan rungon loppu.
  11. Luo iteraattori i, joka osoittaa luettelon ensimmรคiseen elementtiin.
  12. Kรคytรค iteraattorin i osoittamaa erase()-funktiota.
  13. Tulosta tekstiรค konsoliin.
  14. Kรคytรค for-silmukkaa luodaksesi silmukkamuuttujan x. Tรคtรค muuttujaa kรคytetรครคn iteroimaan luetteloelementtien yli.
  15. Tulosta luettelon arvot konsolissa. Tรคmรค tulee poiston jรคlkeen.
  16. For-silmukan rungon loppu.
  17. Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
  18. Main()-funktion rungon loppu.

UKK

std::vector tallentaa elementtejรค yhtenรคiseen muistiin O(1)-satunnaishaulla, kun taas std::list on kaksinkertaisesti linkitetty lista, joka antaa O(1)-lisรคyksen tai -poiston mihin tahansa. Valitse vektori indeksointia varten ja list usein tapahtuvia keskimmรคisiรค lisรคyksiรค varten.

Ei. std::list-funktiolla ei ole hajasaantioperaattoria, joten list[2] ei kรครคnny. Elementtiin pรครคstรครคn iteroimalla begin()- tai end()-funktiosta yksi solmu kerrallaan, mikรค maksaa lineaarisen O(n) aikaa syvรคn position lรถytรคmiseksi.

std::list on kaksinkertaisesti linkitetty lista, joka liikkuu molempiin suuntiin ja tukee push_back-ominaisuutta. std::forward_list on yksinkertaisesti linkitetty lista, joka liikkuu vain eteenpรคin, kรคyttรครค vรคhemmรคn muistia solmua kohden eikรค tarjoa size()- tai kรครคnteisiรค iteraattoreita.

Kutsu jรคsenfunktiota my_list.sort(), joka suoritetaan noin N log N -ajassa ja pitรครค yhtรคsuuret elementit vakaina. std::sort-algoritmi ei toimi, koska se tarvitsee hajasaanti-iteraattoreita. Anna std::greater sort()-funktiolle laskevaa jรคrjestystรค varten.

Solmun lisรครคminen tai poistaminen kestรครค vakiona O(1) aikaa, kun iteraattori pidetรครคn kyseisessรค kohdassa, koska vain naapuriosoittimien muutokset. Solmun lรถytรคminen ensin lรคpikรคynnillรค maksaa silti O(n) aikaa.

Kyllรค. std::list ei ole joukko, joten se tallentaa toistuvia arvoja vapaasti. Jokainen push_back-, push_front- tai insert-kรคsky lisรครค uuden solmun olemassa olevasta sisรคllรถstรค riippumatta. Kรคytรค std::set-kรคskyรค, kun sinun on hylรคttรคvรค kaksoiskappaleet.

Kyllรค. GitHub Copilot kirjoittaa std::list-mรครคrittelyjรค, iteraattorisilmukoita ja lisรครค tai poistaa kutsuja lyhyestรค kommentista tai funktion nimestรค. Se ehdottaa usein std::vectoria, kun yhtenรคinen tallennus sopii tehtรคvรครคn paremmin.

Tekoรคlykoodausavustajat tรคydentรคvรคt STL-konttikoodia automaattisesti, merkitsevรคt iteraattorin vรครคrรคn kรคytรถn, muuntavat std::list-listin std::vektoriksi ja selittรคvรคt monimutkaisuudesta johtuvia kompromisseja. Ne nopeuttavat STL-koodin oppimista, vaikka jokainen ehdotus vaatii silti tarkistusta.

Tiivistรค tรคmรค viesti seuraavasti: