C++ Vector Clear vs Erase

C Vector Clear Vs Erase



Vektor C++ má veľa členských funkcií. Dvaja z nich sú clear() a erase(). jasný() „odstráni“ všetky prvky vektora. erase() „odstráni“ jeden prvok alebo rozsah prvkov. Existujú dva preťažené varianty členskej funkcie erase() pre vektor.

Názov tohto článku je v skutočnosti “Členská funkcia Vector clear() verzus členská funkcia Vector erase() v C++”. Ide o porovnanie dvojčlenných funkcií. Zaoberá sa tým, kedy ktorý použiť, ako ktorý použiť a za akých podmienok sa ktorýkoľvek z nich používa.







Aby bolo možné použiť vektor v programe C++, program by mal začínať takto:



#include

#include

použitím menný priestor std ;

Obsah článku

Vector clear()

Členská funkcia clear() „odstráni“ všetky prvky vektora. Jeho syntax je:



neplatné jasný ( )

Vracia sa za neplatné. Nasledujúci program ilustruje jeho použitie výrazom „vtr.clear();“:





#include

#include

použitím menný priestor std ;



int Hlavná ( )

{

vektor < char > vtr = { 'P' , 'Q' , 'R' , 'S' , 'T' , 'IN' } ;



pre ( vektor < char > :: iterátor to = vtr. začať ( ) ; to ! = vtr. koniec ( ) ; to ++ )

cout << * to << ' ' ;

cout << endl ;



vtr. jasný ( ) ;



pre ( vektor < char > :: iterátor to = vtr. začať ( ) ; to ! = vtr. koniec ( ) ; to ++ )

cout << * to << ' ' ;

cout << endl ;



vrátiť 0 ;

}

Výstupom je jeden riadok:

P Q R S T U

Ak by vektor nebol vymazaný, výstupom by boli dva riadky rovnakej sekvencie. Nezobrazil sa žiadny druhý riadok, pretože všetky prvky boli vymazané.



const vector a clear()

Keď deklarácii vektora predchádza const, znamená to, že prvky vektora nemožno vymazať ani zmeniť. Ak sa výraz pokúsi zmeniť alebo vymazať niektorý z prvkov, program sa neskompiluje. Otestujte nasledujúci program a všimnite si, že sa nekompiluje:

#include

#include

použitím menný priestor std ;



int Hlavná ( )

{

konšt vektor < char > vtr = { 'P' , 'Q' , 'R' , 'S' , 'T' , 'IN' } ;



pre ( vektor < char > :: const_iterator to = vtr. začať ( ) ; to ! = vtr. koniec ( ) ; to ++ )

cout << * to << ' ' ;

cout << endl ;



vtr. jasný ( ) ;



pre ( vektor < char > :: const_iterator to = vtr. začať ( ) ; to ! = vtr. koniec ( ) ; to ++ )

cout << * to << ' ' ;

cout << endl ;



vrátiť 0 ;

}

Ak by bol program testovaný, bolo by vydané chybové hlásenie a neprebehla by žiadna kompilácia. Pretože vektor bol deklarovaný ako konštantný, funkcia clear() nemohla fungovať, výsledkom čoho bolo chybové hlásenie od kompilátora.

Poznámka: clear() vymaže všetky prvky vektora. V skutočnosti označí všetky prvky ako vymazané, takže iné kódy môžu obsadiť ich pamäťové miesta. Ak pamäťové miesto akéhokoľvek prvku ešte nebolo obsadené iným kódom, prvok možno stále znova použiť v mene toho istého vektora.

Vektorové vymazanie

Zjednodušené syntaxe pre dve členské funkcie erase() sú:

a. vymazať ( q )

a

a. vymazať ( q1,q2 )

kde a je názov vektora.

iterator erase (const_iterator position)

Toto je úplná syntax pre „a.erase(q)“. Vracia iterátor ukazujúci na prvok, ktorý bol hneď za vymazaným prvkom. Argument q je iterátor ukazujúci na prvok, ktorý sa má vymazať. Ilustruje to nasledujúci program:

#include

#include

použitím menný priestor std ;



int Hlavná ( )

{

vektor < char > vtr = { 'P' , 'Q' , 'R' , 'S' , 'T' , 'IN' } ;



vektor < char > :: iterátor iter = vtr. začať ( ) ;

++ iter ; ++ iter ;



vektor < char > :: iterátor to = vtr. vymazať ( iter ) ;



pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ ) {

cout << vtr [ i ] << ' ' ;

}

cout << endl ;



cout << * to << endl ;



vrátiť 0 ;

}

Výstupom je:

P Q S T U

S

„R“ bolo vymazané. Vrátený iterátor teraz ukazuje na „S“, ktoré bolo hneď za „R“. Členská funkcia begin() vracia iterátor, ktorý ukazuje na prvý prvok vektora. V kóde bol tento iterátor dvakrát zvýšený, aby ukázal na „R“. „R“ bolo vymazané s výrazom „vtr.erase(iter)“.

Rozsah vo vektore

Pre zoznam

'P' , 'Q' , 'R' , 'S' , 'T' , 'IN'

sekvencia, „Q“, „R“, „S“, „T“ je rozsah. Pri kontajneroch C++ sa však posledný prvok „T“ nepovažuje za súčasť rozsahu. Vo všeobecnosti sa to označuje takto:

[ i, j )

alebo

[ q1, q2 )

„[“ v tomto prípade znamená, že je zahrnutý prvý prvok v sekvencii a „)“ znamená, že posledný prvok nie je zahrnutý.

iterator erase (const_iterator first, const_iterator last)

Toto je úplná syntax pre „a.erase(q1,q2)“. Vracia iterátor ukazujúci na prvok, ktorý bol tesne za vymazaným rozsahom. Poznámka: posledný prvok v rozsahu sa nevymaže. Takže vrátený iterátor bude ukazovať na posledný prvok rozsahu. Argumenty q1 a q2 sú iterátory ukazujúce na prvý a posledný prvok rozsahu. Ilustruje to nasledujúci program:

#include

#include

použitím menný priestor std ;



int Hlavná ( )

{

vektor < char > vtr = { 'P' , 'Q' , 'R' , 'S' , 'T' , 'IN' } ;



vektor < char > :: iterátor itB = vtr. začať ( ) ;

++ itB ;

vektor < char > :: iterátor itE = vtr. koniec ( ) ;

-- itE ; -- itE ;



vektor < char > :: iterátor to = vtr. vymazať ( itB, itE ) ;



pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ ) {

cout << vtr [ i ] << ' ' ;

}

cout << endl ;



cout << * to << endl ;



vrátiť 0 ;

}

Výstupom je:

P T U

T

„Q“, „R“, „S“ boli vymazané. Vrátený iterátor teraz ukazuje na „T“, čo bol posledný prvok v rozsahu kontajnerov. Členská funkcia end() vracia iterátor, ktorý ukazuje hneď za posledný prvok vektora. V kóde bol tento iterátor znížený dvakrát, aby ukázal na „T“, posledný prvok rozsahu. „Q“, „R“, „S“ boli vymazané bez posledného prvku „T“ v rozsahu s výrazom „vtr.erase(itB, itE)“.

const vector a erase()

Ak deklarácii vektora predchádza const, pre konštantu, potom žiadny z jeho prvkov nemožno vymazať. Nasledujúci program sa neskompiluje a zobrazí chybové hlásenie pre výraz a.erase(q):

#include

#include

použitím menný priestor std ;



int Hlavná ( )

{

konšt vektor < char > vtr = { 'P' , 'Q' , 'R' , 'S' , 'T' , 'IN' } ;



vektor < char > :: const_iterator iter = vtr. začať ( ) ;

++ iter ; ++ iter ;



vektor < char > :: const_iterator to = vtr. vymazať ( iter ) ;



pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ ) {

cout << vtr [ i ] << ' ' ;

}

cout << endl ;



cout << * to << endl ;



vrátiť 0 ;

}

Ak by čitateľ program vyskúšal, dostal by chybové hlásenie. Program by nebol skompilovaný.

Nasledujúci program sa neskompiluje a zobrazí chybové hlásenie pre výraz a.erase(q1,q2):

#include

#include

použitím menný priestor std ;



int Hlavná ( )

{

konšt vektor < char > vtr = { 'P' , 'Q' , 'R' , 'S' , 'T' , 'IN' } ;



vektor < char > :: const_iterator itB = vtr. začať ( ) ;

++ itB ;

vektor < char > :: const_iterator itE = vtr. koniec ( ) ;

-- itE ; -- itE ;



vektor < char > :: const_iterator to = vtr. vymazať ( itB, itE ) ;



pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ ) {

cout << vtr [ i ] << ' ' ;

}

cout << endl ;



cout << * to << endl ;



vrátiť 0 ;

}

Poznámka: erase() vymaže prvok alebo rozsah prvkov. V skutočnosti označí prvok ako vymazaný, takže ich pamäťové miesta môžu byť obsadené inými kódmi. Ak pamäťové miesto akéhokoľvek prvku ešte nebolo obsadené iným kódom, prvok možno stále znova použiť v mene toho istého vektora.

pop_back()

Vektorová členská funkcia pop_back() je druh funkcie erase(). Vymaže však iba posledný prvok vektora. Syntax je:

neplatné pop_back ( )

Nepotrebuje žiadne argumenty a vracia sa ako neplatný. Nasledujúci program ilustruje jeho použitie:

#include

#include

použitím menný priestor std ;



int Hlavná ( )

{

vektor < char > vtr = { 'P' , 'Q' , 'R' , 'S' , 'T' , 'IN' } ;



vtr. pop_back ( ) ;



pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ ) {

cout << vtr [ i ] << ' ' ;

}

cout << endl ;



vrátiť 0 ;

}

Výstupom je:

P Q R S T

Posledný prvok „U“ bol odstránený (vymazaný).

Zničenie vektora

Môže byť vektor zničený? - Áno! Keď je však vektor zničený, všetky jeho prvky sa vymažú okrem jeho mena; čo znamená, že deklaráciu vektora možno stále znova použiť, ale s určitou neistotou. Syntax na zničenie vektora je:

a.~X ( )

kde „a“ je názov vektora. Ilustruje to nasledujúci program:

#include

#include

použitím menný priestor std ;



int Hlavná ( )

{

vektor < char > vtr = { 'P' , 'Q' , 'R' , 'S' , 'T' , 'IN' } ;



vtr.~vektor ( ) ;



vtr = { 'V' , 'IN' , 'X' , „A“ , 'S' } ;



pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ ) {

cout << vtr [ i ] << ' ' ;

}

cout << endl ;



vtr.~vektor ( ) ;



vtr. push_back ( 'A' ) ;

vtr. push_back ( 'B' ) ;

vtr. push_back ( 'C' ) ;

vtr. push_back ( 'D' ) ;

vtr. push_back ( „A“ ) ;



pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ ) {

cout << vtr [ i ] << ' ' ;

}

cout << endl ;

vrátiť 0 ;

}

Výstupom je:

V W X Y Z
p ^ t e @ A  C D E

z autorovho počítača s niektorými nespoľahlivými znakmi v druhom riadku.

Záver

Vektorovú členskú funkciu clear() možno porovnať s vektorovou členskou funkciou erase(). Nie sú to náhradníci. clear() vymaže všetky prvky vektora. V skutočnosti označí všetky prvky ako vymazané, takže ich pamäťové miesta môžu byť obsadené inými kódmi. Ak pamäťové miesto akéhokoľvek prvku ešte nebolo obsadené iným kódom, prvok možno stále znova použiť v mene toho istého vektora. erase() vymaže prvok alebo rozsah prvkov. V skutočnosti označí prvok ako vymazaný, takže miesto v pamäti môže byť obsadené iným kódom. Ak pamäťové miesto akéhokoľvek vymazaného prvku ešte nebolo obsadené iným kódom, prvok môže byť stále znovu použitý v mene toho istého vektora. clear má podobnosť so zničením, ~X().