std::loend sisse C++ koos Näitega

⚡ Nutikas kokkuvõte

std::loend sisse C++ on kahekordselt lingitud loendina teostatud järjestuskonteiner, mis võimaldab kiiret sisestamist ja kustutamist mis tahes positsioonil, salvestades samal ajal elemente mittekülgnevas mälus ja toetades kahesuunalist järjestikust juurdepääsu juhusliku juurdepääsu asemel.

  • 🔗 Topeltlingitud loend: Igal elemendil on lingid oma eelmise ja järgmise sõlmega, seega asuvad std::list andmed mitte-külgnevas mälus.
  • Kiire sisestamine ja kustutamine: Elemendi lisamine või eemaldamine teadaolevas positsioonis on konstantse aja protsess, erinevalt vektorist, mis nihutab elemente.
  • 🚫 Juhusliku juurdepääsuta: Elementideni jõutakse järjestikuse läbimise teel mõlemast otsast, seega indekseerimine, näiteks list[3], pole saadaval.
  • 🧩 Konstruktorid: Default, fill, range, copy, move ja initsialiseerija-loendi konstruktorid ehitavad std::list-i erineval viisil.
  • 🛠️ Liikmete funktsioonid: push_front(), push_back(), insert(), erase(), size(), reverse() ja merge() haldavad loendi sisu.
  • 🤖 AI abi: GitHub Copilot ja sarnased assistendid loovad tugistruktuuri std::list deklaratsioonidele, iteraatoritele ning lisavad või kustutavad lühikesest kommentaarist loogikat.

std::loend sisse C++

Mis on std::list?

In C++, std::list viitab salvestuskonteinerile. Std::list võimaldab teil üksusi lisada ja eemaldada kõikjalt. Std::list on rakendatud kahekordselt lingitud loendina. See tähendab, et loendiandmetele saab juurde pääseda kahesuunaliselt ja järjestikku.

Standardmallide teegi loend ei toeta kiiret juhuslikku juurdepääsu, kuid see toetab järjestikust juurdepääsu igast suunast.

Saate loendielemente erinevatesse mälutükkidesse hajutada. Andmetele järjestikuseks juurdepääsuks vajalik teave salvestatakse konteinerisse. Std::loend võib käitamise ajal vajaduse korral mõlemast otsast laieneda ja kahaneda. Sisemine jaotur täidab automaatselt salvestusnõuded.

Need omadused tekitavad praktilise küsimuse: millal peaksite tegelikult nimekirja järele haarama?

Miks kasutada std::list?

Siin on std::list kasutamise põhjused:

  • std::list toimib paremini võrreldes teiste järjestuskonteineritega, näiteks massiivi ja vektoriga.
  • Neil on parem jõudlus sisestamisel, liigutamisel ja väljutamiseltracelementide liigutamine mis tahes asendist.
  • Std::list saab paremini hakkama ka algoritmidega, mis selliseid toiminguid intensiivselt sooritavad.

Kui põhjused on selged, on järgmine samm süntaks, mis neid deklareerib.

Loendi süntaks

Std::listi määratlemiseks peame importima päisefail. Siin on std::list definitsiooni süntaks:

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

Siin on ülaltoodud parameetrite kirjeldus:

  • T – Määrab sisalduva elemendi tüübi. T saab asendada mis tahes andmetüübiga, isegi kasutaja määratletud tüüpidega.
  • Alloc – Määrab eraldajaobjekti tüübi. See kasutab vaikimisi eraldajaklassi malli. See on väärtuspõhine ja kasutab lihtsat mälu eraldamise mudelit.

Näiteks 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';
	}
}

Väljund:

Std::list loomise ja iteratsiooni näite väljund

Siin on koodi ekraanipilt:

C++ kood, mis loob std::listi ja printib selle for-tsükliga

Code Selgitus:

  1. Lisage selle funktsioonide kasutamiseks algoritmi päisefail.
  2. Selle funktsioonide kasutamiseks lisage iostreami päisefail.
  3. Lisage selle funktsioonide kasutamiseks loendi päise fail.
  4. Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
  5. Looge loend nimega minu_loend 4 täisarvuga.
  6. Kasutama silmuse jaoks tsüklimuutuja x loomiseks. Seda muutujat kasutatakse loendi elementide läbimiseks.
  7. Printige välja loendi väärtused konsoolil.
  8. For-silmuse keha lõpp.
  9. Funktsiooni main() keha lõpp.

C++ Funktsioonide loend

Siin on levinumad std::list funktsioonid:

funktsioon Kirjeldus
sisesta () See funktsioon lisab uue elemendi enne positsiooni, mille iteraator osutab.
push_back() See funktsioon lisab loendi lõppu uue üksuse.
push_front() See lisab loendi esiossa uue üksuse.
pop_front() See kustutab loendi esimese üksuse.
suurus () See funktsioon määrab loendi elementide arvu.
ees() Määrab loendi esimesed üksused.
tagasi () Määrab loendi viimase üksuse.
tagurpidi() See pöörab loendi üksused ümber.
ühenda() See ühendab kaks sorteeritud loendit.

Konstruktorid

Siin on nimekiri funktsioonid pakutud päisefail:

  • Vaikekonstruktor std::list::list()- See loob tühja loendi, mis sisaldab null elemente.
  • Täida konstruktor std::list::list()- See loob loendi n elemendiga ja määrab igale elemendile väärtuse null (0).
  • Vahemiku konstruktor std::list::list()- loob loendi paljude elementidega vahemikus esimesest viimaseni.
  • Kopeeri konstruktor std::list::list()- See loob loendi kõigi olemasolevas loendis sisalduvate elementide koopiatega.
  • Move constructor std::list::list()- loob teisaldamise semantika abil loendi teise loendi elementidega.
  • Initsialiseerija loendi konstruktor std::list::list()-see loob teise loendi elementidega loendi, kasutades liigutamise semantikat.

Näiteks 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;
}

Väljund:

std::list konstruktorite näite väljund

Siin on koodi ekraanipilt:

C++ kood, mis demonstreerib std::list default, range ja move konstruktoreid

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage iostreami päisefail.
  2. Lisage selle funktsioonide kasutamiseks loendi päise fail.
  3. Lisage koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  4. Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
  5. Looge tühi loend nimega l.
  6. Looge 1 täisarvuga loend nimega l3.
  7. Looge loend nimega l2 koos kõigi loendi l1 elementidega algusest lõpuni.
  8. Looge liigutamise semantika abil loend nimega l3. Loendil l3 on sama sisu kui loendil l2.
  9. Printige konsoolil koos muu tekstiga loendi l suurus.
  10. Printige konsoolile teksti.
  11. Looge iteraator nimega see ja kasutage seda loendi l2 elementide itereerimiseks.
  12. Printige konsoolile loendi elemendid nimega l2.
  13. Printige konsoolile teksti.
  14. Looge iteraator nimega see ja kasutage seda loendi l3 elementide itereerimiseks.
  15. Printige konsoolile loendi elemendid nimega l3.
  16. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  17. Funktsiooni main() keha lõpp.

Konteinerite omadused

Siin on konteineri atribuutide loend:

vara Kirjeldus
Jada Järjestuskonteinerid järjestavad oma elemendid ranges lineaarses järjestuses. Elementidele pääseb juurde nende asukoha järgi järjestuses.
Topeltlingitud loend Igal elemendil on teave eelmiste ja järgmiste elementide leidmise kohta. See võimaldab sisestamis- ja kustutamistoiminguteks pidevalt aega.
Jaotaja-teadlik Jaotajaobjekti kasutatakse salvestusmahu dünaamiliseks muutmiseks.

Sisestamine loendisse

Väärtuste loendisse lisamiseks on erinevaid funktsioone, mida saame kasutada. Vaatame seda:

Näiteks 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';
	}
}

Väljund:

Väljund pärast elementide lisamist std::list-i

Siin on koodi ekraanipilt:

C++ kood, mis kasutab push_front, push_back ja insert funktsiooni std::list-i

Code Selgitus:

  1. Lisage selle funktsioonide kasutamiseks algoritmi päisefail.
  2. Selle funktsioonide kasutamiseks lisage iostreami päisefail.
  3. Lisage selle funktsioonide kasutamiseks loendi päise fail.
  4. Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
  5. Looge loend nimega minu_loend 4 täisarvuga.
  6. Sisestage element 11 loendi nimega minu_loend ette.
  7. Sisestage element 18 loendi nimega minu_loend lõppu.
  8. Looge see iteraator ja kasutage seda elemendi 10 leidmiseks loendist my_list.
  9. Kasutage if-lauset, et teha kindlaks, kas ülaltoodud element leiti või mitte.
  10. Sisestage element 21 enne ülaltoodud elementi, kui see leiti.
  11. Kui-lause põhiosa lõpp.
  12. Kasutage tsüklit for tsüklimuutuja x loomiseks. Seda muutujat kasutatakse loendielementide kordamiseks.
  13. Printige välja loendi väärtused konsoolil.
  14. For silmuse keha lõpp.
  15. Funktsiooni main() keha lõpp.

Loendisse lisatud elemente saab sama hästi ka välja võtta.

Loendist kustutamine

Loendist on võimalik üksusi kustutada. Funktsioon erase() võimaldab teil loendist ühe või mitme üksuse kustutada.

  • Ühe üksuse kustutamiseks edastage lihtsalt üks täisarvu positsioon. Üksus kustutatakse.
  • Vahemiku kustutamiseks tuleb läbida algus- ja lõpp-iteraatorid. Vaatame seda demonstreerima.

Näiteks 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;
}

Väljund:

Väljund pärast elemendi kustutamist std::listist

Siin on koodi ekraanipilt:

C++ kood, mis kasutab std::list-is kustutamisfunktsiooni

Code Selgitus:

  1. Lisage selle funktsioonide kasutamiseks algoritmi päisefail.
  2. Selle funktsioonide kasutamiseks lisage iostreami päisefail.
  3. Lisage selle funktsioonide kasutamiseks loendi päise fail.
  4. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  5. Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
  6. Looge loend nimega minu_loend 4 täisarvuga.
  7. Printige konsoolile teksti.
  8. Kasutage tsüklit for tsüklimuutuja x loomiseks. Seda muutujat kasutatakse loendielementide kordamiseks.
  9. Printige välja loendi väärtused konsoolil.
  10. For-silmuse keha lõpp.
  11. Loo iteraator i, mis osutab loendi esimesele elemendile.
  12. Kasutage iteraatori i juhitud funktsiooni erase().
  13. Printige konsoolile teksti.
  14. Kasutage tsüklit for tsüklimuutuja x loomiseks. Seda muutujat kasutatakse loendielementide kordamiseks.
  15. Printige välja loendi väärtused konsoolil. See tuleb pärast kustutamist.
  16. For-silmuse keha lõpp.
  17. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  18. Funktsiooni main() keha lõpp.

KKK

std::vector salvestab elemente külgnevas mälus O(1) juhusliku juurdepääsuga, samas kui std::list on kahekordselt lingitud loend, mis võimaldab O(1) lisamist või kustutamist kõikjale. Valige indekseerimiseks vektor ja sagedaste keskmiste lisamiste jaoks list.

Ei. std::list-il puudub muutpöördusoperaator, seega list[2] ei kompileeru. Elementi jõutakse funktsiooni begin() või end() abil ühe sõlme kaupa itereerides, mis maksab sügava positsiooni jaoks lineaarselt O(n) aega.

std::list on kahekordselt lingitud loend, mis liigub mõlemas suunas ja toetab push_back funktsiooni. std::forward_list on ühekordselt lingitud loend, mis liigub ainult edasi, kasutab sõlme kohta vähem mälu ning ei paku size() ega tagasipöörduvaid iteraatoreid.

Kutsu välja liikmesfunktsioon my_list.sort(), mis töötab umbes N log N aja jooksul ja hoiab võrdsed elemendid stabiilsena. std::sort algoritm ei tööta, kuna see vajab suvalise juurdepääsuga iteraatoreid. Laskuvas järjekorras sort() funktsioonile tuleb anda std::greater.

Sõlme lisamine või kustutamine võtab konstantse O(1) aja, kui iteraatori sellel positsioonil hoitakse, sest muutuvad ainult naaberosutid. Selle positsiooni esmane leidmine läbimise teel maksab ikkagi O(n) aega.

Jah. std::list ei ole komplekt, seega salvestab see korduvaid väärtusi vabalt. Iga push_back, push_front või insert lisab uue sõlme olenemata olemasolevast sisust. Kasutage std::set funktsiooni, kui teil on vaja duplikaatelemente tagasi lükata.

Jah. GitHubi koopia kirjutab std::list deklaratsioone, iteraatoritsükleid ning lisab või kustutab lühikese kommentaari või funktsiooni nime abil kõnesid. Sageli soovitab see std::vectorit, kui külgnev salvestusruum sobib ülesandega paremini.

Tehisintellektiga kodeerimisassistendid täidavad STL-konteineri koodi automaatselt, märgistavad vale iteraatori kasutuse, teisendavad std::listi std::vektoriks ja selgitavad keerukusega seotud kompromisse. Need kiirendavad STL-i õppimist, kuigi iga ettepanek vajab siiski ülevaatamist.

Võta see postitus kokku järgmiselt: