std::list in C++ esimerkin kanssa
Mikä on std::list?
In C++, std::lista viittaa varastosäiliöön. std:list mahdollistaa kohteiden lisäämisen ja poistamisen mistä tahansa. Std::list on toteutettu kaksoislinkitettynä luettelona. Tämä tarkoittaa, että luettelotietoja voidaan käyttää kaksisuuntaisesti ja peräkkäin.
Standard Template Library -luettelo ei tue nopeaa satunnaiskäyttöä, mutta se tukee peräkkäistä pääsyä 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.
Miksi käyttää std::list?
Tässä on syyt std::List:n käyttöön:
- Std::lista on parempi verrattuna muihin sekvenssisäiliöihin, kuten matriisi ja vektori.
- Niillä on parempi suorituskyky elementtien asettamisessa, siirtämisessä ja poistamisessa mistä tahansa asennosta.
- Std::list toimii paremmin myös algoritmeilla, jotka suorittavat tällaisia toimintoja intensiivisesti.
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ää sisällytettävän elementin tyypin. Voit korvata T:n millä tahansa tietotyypillä, myös käyttäjän määrittämillä tyypeillä.
- Alloc – Määrittää allokaattoriobjektin tyypin. Tämä käyttää oletusarvoisesti allokaattoriluokan mallia. Se on arvosta riippuvainen ja käyttää yksinkertaista muistin varausmallia.
Esimerkit 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ö:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä algoritmin otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä iostream-otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä luettelon otsikkotiedosto käyttääksesi sen toimintoja.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä tämän funktion runkoon.
- Luo lista nimeltä oma_luettelo 4 kokonaislukujoukolla.
- Käytä for-silmukkaa luodaksesi silmukkamuuttujan x. Tätä muuttujaa käytetään iteroimaan luetteloelementtien yli.
- Tulosta luettelon arvot konsolissa.
- Rungon loppu silmukalle.
- 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ö:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä iostream-otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä luettelon otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä std-nimiavaruus koodiin, jotta voit käyttää sen luokkia kutsumatta sitä.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä tämän funktion runkoon.
- Luo tyhjä lista nimeltä l.
- Luo lista nimeltä l1, jossa on 3 kokonaislukua.
- Luo lista nimeltä l2, jossa on kaikki listan l1 elementit alusta loppuun.
- Luo l3-niminen lista käyttämällä siirtosemantiikkaa. Listalla l3 on sama sisältö kuin listalla l2.
- Tulosta l-nimisen luettelon koko konsoliin muun tekstin rinnalle.
- Tulosta tekstiä konsoliin.
- Luo iteraattori nimeltä se ja käytä sitä iteroitaessa listan l2 elementtejä.
- Tulosta l2-nimisen luettelon elementit konsoliin.
- Tulosta tekstiä konsoliin.
- Luo iteraattori nimeltä se ja käytä sitä iteroitaessa listan l3 elementtejä.
- Tulosta l3-nimisen luettelon elementit konsoliin.
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- 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
On olemassa erilaisia toimintoja, joiden avulla voimme lisätä arvoja luetteloon. Osoitetaan tämä:
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ö:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä algoritmin otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä iostream-otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä luettelon otsikkotiedosto käyttääksesi sen toimintoja.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä tämän funktion runkoon.
- Luo lista nimeltä oma_luettelo 4 kokonaislukujoukolla.
- Lisää elementti 11 listan "my_list" etupuolelle.
- Lisää elementti 18 listan loppuun, jonka nimi on my_list.
- Luo se iteraattori ja etsi sen avulla elementti 10 listasta my_list.
- Käytä if-lausetta määrittääksesi, löytyikö yllä oleva elementti vai ei.
- Aseta elementti 21 ennen yllä olevaa elementtiä, jos se löytyi.
- if-lauseen rungon loppu.
- Käytä for-silmukkaa luodaksesi silmukkamuuttujan x. Tätä muuttujaa käytetään iteroimaan luetteloelementtien yli.
- Tulosta luettelon arvot konsolissa.
- For-silmukan rungon loppu.
- Main()-funktion rungon loppu.
Poistaminen luettelosta
On mahdollista poistaa kohteita luettelosta. Erase()-toiminnolla voit poistaa kohteen tai joukon kohteita luettelosta.
- Jos haluat poistaa yhden kohteen, annat vain yhden kokonaisluvun sijainnin. Kohde poistetaan.
- Jos haluat poistaa alueen, ohitat aloitus- ja loppuiteraattorit. Osoitetaan tämä.
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ö:
Tässä kuvakaappaus koodista:
Koodin selitys:
- Sisällytä algoritmin otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä iostream-otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä luettelon otsikkotiedosto käyttääksesi sen toimintoja.
- Sisällytä std-nimiavaruus ohjelmaamme, jotta voit käyttää sen luokkia kutsumatta sitä.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä tämän funktion runkoon.
- Luo lista nimeltä oma_luettelo 4 kokonaislukujoukolla.
- Tulosta tekstiä konsoliin.
- Käytä for-silmukkaa luodaksesi silmukkamuuttujan x. Tätä muuttujaa käytetään iteroimaan luetteloelementtien yli.
- Tulosta luettelon arvot konsolissa.
- For-silmukan rungon loppu.
- Luo iteraattori i, joka osoittaa luettelon ensimmäiseen elementtiin.
- Käytä iteraattorin i osoittamaa erase()-funktiota.
- Tulosta tekstiä konsoliin.
- Käytä for-silmukkaa luodaksesi silmukkamuuttujan x. Tätä muuttujaa käytetään iteroimaan luetteloelementtien yli.
- Tulosta luettelon arvot konsolissa. Tämä tulee poiston jälkeen.
- For-silmukan rungon loppu.
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- Main()-funktion rungon loppu.
Yhteenveto
- Std::list on tallennussäiliö.
- Se mahdollistaa kohteiden lisäämisen ja poistamisen mistä tahansa jatkuvasti.
- Se toteutetaan kaksoislinkkinä
- Std::list-tietoja voidaan käyttää kaksisuuntaisesti ja peräkkäin.
- std::list ei tue nopeaa satunnaiskäyttöä. Se tukee kuitenkin peräkkäistä pääsyä kaikista suunnista.
- Voit sirottaa std::list:n listaelementtejä eri muistipaloihin.
- Voit pienentää tai laajentaa std::list -luetteloa molemmista päistä tarpeen mukaan ajon aikana.
- Jos haluat lisätä kohteita std::listiin, käytämme insert()-funktiota.
- Jos haluat poistaa kohteita std::listista, käytämme erase()-funktiota.