Waarom bestaat std::vector::push_front() niet?

Aangezien std::vector::push_back()bestaat, waarom bestaat std::vector::push_front()dan niet ook?

Ik weet dat er andere opslagobjecten zijn die ongeveer op dezelfde manier werken en een implementatie hebben van zowel de functies push_back()als push_front(), maar ik was nieuwsgierig over de reden waarom std::vectordat niet doet.


Antwoord 1, autoriteit 100%

Je wilt nooit een vector push_front. Een element toevoegen aan de voorkant betekent dat elk ander element in de vector één element naar achteren wordt verplaatst: O (n) kopiëren. Vreselijke prestatie.


Antwoord 2, autoriteit 31%

Daar is een belangrijke reden voor: std::vector<> is een continue, single-ended array-container. Het wijst geheugen toe en begint de elementen aan het begin van de toegewezen regio te schrijven. Het wijst meestal meer geheugen toe dan het nodig heeft om alle huidige elementen op te slaan, dus wanneer je push_back() aanroept, schrijft het het nieuwe element aan het einde en verhoogt het zijn aantal elementen. Het is snel en efficiënt.

Push_front(), aan de andere kant, zou op de een of andere manier het nieuwe element VR alle huidige moeten schrijven, op positie [0] – maar dat is niet triviaal, aangezien je arraypositie [0] al bezet is. Push_front() zou ervoor zorgen dat de hele array opnieuw wordt gekopieerd, zodat de voorkant kan worden gewijzigd. Het zou een inefficiënte operatie zijn waarvoor std::vector<> klasse is niet ontworpen.

Je kunt het natuurlijk nog steeds doen door te bellen

std::vector::insert(begin(), 1, val)

Maar het zorgt ervoor dat de hele array wordt gekopieerd om maar één element toe te voegen.

Other episodes