lists stl
Lär känna allt om listor i STL tillsammans med dess implementering.
Listor är sekventiella behållare. Listor innehåller element på icke sammanhängande platser. Vi har diskuterat arrays och vektorer i våra tidigare tutorials.
När det gäller array- och vektorbehållare, när dessa behållare lagrar data i angränsande minne, visar sig insats i mitten av dessa behållare vara mycket kostsamt eftersom vi måste flytta de befintliga elementen för att skapa plats för det nya elementet.
=> Se här för att utforska den fullständiga C ++ -handledarlistan.
vänta 1 sekund
Vad du kommer att lära dig:
Översikt
Listan är en behållare som övervinner denna nackdel med array- och vektorkontainrar. Det tillåter oss att infoga element var som helst i listan utan att orsaka mycket av ett overhead. Men listor är långsammare än vektorer när det gäller traversal.
I denna handledning kommer vi att se implementeringen av listor i STL tillsammans med de olika operationerna för traversal, manipulationer och åtkomstlista med exempel.
Observera att en majoritet av listoperationerna liknar de hos vektorer och därför kommer läsare som redan har läst vår handledning om vektorer inte att ha problem med att tolka listkoncept.
Deklaration och initialisering
För att implementera listcontainern och använda alla dess fördelar måste vi inkludera en rubrikfil i vårt program.
#include
Den allmänna deklarationen för listcontainern är
std::list listName;
Till exempel,vi kan deklarera en lista med namnet 'min lista' av typen int enligt följande:
std::list mylist;
Vi kan också initialisera listan vid tidpunkten för deklarationen eller lägga till element i den med en av de åtgärder den stöder.
Låt oss se hur vi kan initialisera listan vi skapade ovan.
std::list mylist = {1, 1, 2, 3, 5};
Ovanstående initialisering kommer att läggas ut i minnet enligt nedan:
När vi har initialiserat listan kan vi komma åt elementen i en lista med en iterator. Iteratorfunktionerna 'börja' och 'slut' hjälper oss att korsa genom listelementen.
Notera: Iterator för listan stöder också andra iteratorer som reverse iterators (rbegin, rend), constant iterators (cbegin, cend) och constant reverse iterators (crbegin, crend) och kan användas på liknande sätt som vektorer.
Följande exempel visar detta.
#include #include #include #include using namespace std; int main() { list mylist = {1, 1, 2, 3, 5}; cout<<”List elements are: “; list::iterator it; for(it=mylist.begin();it!=mylist.end();++it) cout<<*it<<” “; }
Produktion:
Listelement är: 1 1 2 3 5
Således har vi i ovanstående exempel deklarerat en lista över Fibonacci-sekvensen. Därefter förklarar vi en iterator av samma typ som listan och sedan använder vi för loop, vi skriver ut listinnehållet från början till slut.
Låt oss nu hoppa till de funktioner eller funktioner som listan behållare i STL ger oss.
Listoperationer
- Föra in: Används för att infoga ett element i den angivna positionen. Returnerar en iterator som pekar på det första inlagda elementet.
infoga (pos, num_elem, elem)
Var,
pos => Position där nya element ska infogas.
num_elem => Antal element som ska infogas som standard är 1.
artikel => Verkligt värde som ska infogas.
Låt oss förstå insatsfunktionen genom att ta ett exempel.
#include #include // for list operations using namespace std; int main() { list mylist = {1,1,2}; list::iterator it = mylist.begin(); // iterator to point to 4th position advance(it,` 3); // inserts 3 at 4th position mylist.insert(it, 3); cout << 'The list after inserting' << ' 1 element using insert() is : '; for (list::iterator i = mylist.begin();i != mylist.end();i++) cout << *i << ' '; cout << endl; }
Produktion:
Listan efter att ett element har infogats med insert () är: 1 1 2 3
Detta är ett exempel på att bara infoga ett element vid 4thposition i listan som så småningom är den sista positionen. Därför har vi först en lista för vilken vi har definierat iteratorn som pekar på början av listan. Sedan flyttar vi denna iterator till 4thposition och anrop sedan infoga för att infoga 1 element.
Vi kan också infoga mer än ett element genom att ange den andra parametern i infogningsfunktionen. Varje gång det inte anges, är det som standard 1.
- trycka tillbaka :Lägger till ett nytt element i slutet av listan.
- push_front :Lägger till ett nytt element i början av listan.
Låt oss se ett exempel som visar användningen av push_back och push_front-funktioner.
#include #include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3}; cout<<'List elements are: '; printlist(mylist); mylist.push_front(0); mylist.push_back(5); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
Produktion:
Listelement är: 1 1 2 3
Lista innehåll efter push_front och push_back: 0 1 1 2 3 5
I det här exemplet skapar och listar vi först alla två elementen till den, en på framsidan och på baksidan med hjälp av push_front respektive push_back-funktioner. Utgången visar den ändrade listan efter att båda funktionerna har utförts.
- pop_back :Tar bort det sista elementet i listan och minskar därmed liststorleken med 1.
- pop_front :Tar bort det första elementet i listan och minskar därmed liststorleken med 1.
Följande exempel visar användningen av pop_back och pop_front-operationer i listan.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); mylist.pop_front(); mylist.pop_back(); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
Produktion:
Listelement är: 1 1 2 3 5
Lista innehåll efter push_front och push_back: 1 2 3
Såsom beskrivs i operationens definition tar var och en av operationerna pop_front och pop_back bort elementet från framsidan och baksidan av listan, dvs. första och det sista elementet i listan, och därmed varje gång minskar listans storlek med 1.
- storlek :Returnerar storleken på listan, dvs. antalet element i listan.
- tömma :Kontrollerar om listan är tom.
- radera :Tar bort ett element eller ett intervall av element från listan.
- klar :Tar bort alla element från listan genom att göra den till storlek 0.
Nedan ges ett exempel för att demonstrera användningen av alla ovanstående funktioner, dvs. storlek, tom, radera och rensa.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'size of the list: '< Produktion:
Listelement är: 1 1 2 3 5
listans storlek: 5
Lista efter radering av första element: 1 2 3 5
Listans nya storlek: 4
listans storlek efter rensning: 0
hur man öppnar bin-filfönster
Ovanstående program visar alla fyra funktioner relaterade till listans kapacitet. Vi ser att liststorleken minskar med 1 när vi raderar ett element i listan. När vi kallar en tydlig operation på listan är storleken 0 vilket innebär att alla element i listan tas bort.
- främre :Returnerar värdet för det första elementet i listan.
- tillbaka :Returnerar värdet för det sista elementet i listan.
- byta :Byt ut innehållet i en lista med innehållet i en annan lista av samma storlek och typ.
- omvänd :En algoritm som vänder listan.
- sortera :Sorterar den angivna listan.
Nedanstående exempel visar användningen av funktionerna fram, bak, bakåt, sortering och byte.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'
Front of the list: '< Produktion:
Listelement är: 1 1 2 3 5
Framsidan av listan: 1
Baksidan av listan: 5
Omvänd lista: 5 3 2 1 1
Innehåll i udda lista: 1 3 5 7 9
Efter byte
min lista: 1 3 5 7 9
Udda lista: 5 3 2 1 1
I den här koden skriver vi först ut de främre och bakre värdena på listan mylist. Sedan omvandlas denna lista och den omvända listan skrivs ut. Därefter definierar vi ytterligare en lista med udda nummer som inte är i någon ordning och vi kallar 'Sortera' -algoritmen för att sortera listan. Sedan byter vi de två listorna med swap-funktionen och skriver ut de utbytta listorna.
- splitsa :Denna funktion används för att överföra innehållet i en lista till en annan lista på en angiven position.
Båda listorna måste vara av samma typ.
skarv (position, lista);
var,
position => Position där listinnehållet ska överföras.
lista => Lista vars element ska överföras.
Exemplet nedan visar användningen av skarvfunktionen.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 8,13}; cout<<'List elements are: '; printlist(mylist); list seclist = {2,3,5}; cout<<'list to be spliced: '; printlist(seclist); list:: iterator it = mylist.begin(); it ++; it++; mylist.splice(it,seclist); cout<<'
List contents after splicing at position 2: '; printlist(mylist); }
Produktion:
Listelement är: 1 1 8 13
lista som ska skarvas: 2 3 5
Lista innehåll efter skarvning vid position 2: 1 1 2 3 5 8 13
De exempel visar att vi använder två listor. Först flyttas iteratorn för min lista till två positioner och sedan kallas skarvfunktionen för att överföra innehållet i den andra listan till den tredje positionen i den första listan.
- gå :Till skillnad från skarvfunktion som kan användas för att överföra innehållet i en lista till en annan på en specifik position, slår sammanfogning direkt samman två listor för att bilda en enda lista. För sammanfogning måste båda listorna vara i sorterad ordning.
Nedan ges ett exempel för att visa sammanslagningsfunktionen.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1,2,3,5,8}; list seclist = {4,6,7}; cout<<'First List: '; printlist(mylist); cout< Produktion:
Första listan: 11 2 3 5 8
Andra listan: 4 6 7
Lista innehåll efter sammanfogning av två listor:
1 1 2 3 4 5 6 7 8
Således i ovanstående program har vi två listor som är sorterade. Vi kallar sammanslagning på dessa två listor. Den resulterande listan är en sorterad lista som innehåller elementen i båda listorna.
Slutsats
Vi har kommit till slutet av denna handledning om listor i STL. Vi hoppas att denna handledning skulle ha gett dig enorm kunskap om listor i STL.
=> Kolla här för att se A-Z av C ++ träningstutorialer här.
Rekommenderad läsning