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 UAk 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 US
„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 UT
„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 TPosledný 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 Zp ^ 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().