C++ Vector Clear vs Erase

C Vector Clear Vs Erase



C++ vektor ima mnogo funkcija članova. Dvoje od njih jesu clear() i erase(). čisto() “uklanja” sve elemente vektora. erase() 'uklanja' jedan element ili niz elemenata. Postoje dvije preopterećene varijante funkcije člana erase() za vektor.

Naslov ovog članka zapravo je “Vector clear() Function Member nasuprot Vector erase() Member Function, u C++”. Ovo je usporedba dvočlanih funkcija. Bavi se time kada koristiti koji, kako koristiti koji i pod kojim se uvjetima koristi bilo koji.







Da biste koristili vektor u C++ programu, program bi trebao započeti s:



#uključi

#include

korištenjem imenski prostor std ;

Sadržaj članka

Vektor jasno ()

Funkcija članica clear() 'uklanja' sve elemente vektora. Njegova sintaksa je:



poništiti čisto ( )

Vraća se prazninom. Sljedeći program ilustrira njegovu upotrebu izrazom 'vtr.clear();':





#uključi

#include

korištenjem imenski prostor std ;



int glavni ( )

{

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



za ( vektor < char > :: iterator to = vtr. početi ( ) ; to ! = vtr. kraj ( ) ; to ++ )

cout << * to << ' ' ;

cout << endl ;



vtr. čisto ( ) ;



za ( vektor < char > :: iterator to = vtr. početi ( ) ; to ! = vtr. kraj ( ) ; to ++ )

cout << * to << ' ' ;

cout << endl ;



povratak 0 ;

}

Izlaz je jedan redak:

P Q R S T U

Da vektor nije obrisan, izlaz bi bila dva retka istog niza. Drugi red nije prikazan jer su svi elementi izbrisani.



vektor const i clear()

Kada vektorskoj deklaraciji prethodi const, to znači da se elementi vektora ne mogu brisati ili mijenjati. Ako izraz pokuša promijeniti ili izbrisati bilo koji od elemenata, program se neće prevesti. Testirajte sljedeći program i imajte na umu da se ne kompajlira:

#uključi

#include

korištenjem imenski prostor std ;



int glavni ( )

{

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



za ( vektor < char > :: const_iterator to = vtr. početi ( ) ; to ! = vtr. kraj ( ) ; to ++ )

cout << * to << ' ' ;

cout << endl ;



vtr. čisto ( ) ;



za ( vektor < char > :: const_iterator to = vtr. početi ( ) ; to ! = vtr. kraj ( ) ; to ++ )

cout << * to << ' ' ;

cout << endl ;



povratak 0 ;

}

Da je program testiran, bila bi izdana poruka o pogrešci i ne bi bilo nikakve kompilacije. Budući da je vektor proglašen konstantnim, funkcija clear() nije mogla raditi, što je rezultiralo porukom o pogrešci od kompilatora.

Bilješka: clear() briše sve elemente vektora. Zapravo, označava sve elemente kao izbrisane, tako da drugi kodovi mogu zauzeti njihove memorijske lokacije. Ako memorijska lokacija bilo kojeg elementa još nije zauzeta drugim kodom, tada se element još uvijek može ponovno koristiti u ime istog vektora.

Brisanje vektora

Pojednostavljene sintakse za dvije funkcije članice erase() su:

a. izbrisati ( q )

i

a. izbrisati ( q1,q2 )

gdje je a ime vektora.

brisanje iteratora (const_iterator pozicija)

Ovo je potpuna sintaksa za 'a.erase(q)'. Vraća iterator koji pokazuje na element koji je bio odmah iza onog izbrisanog. Argument q je iterator koji pokazuje na element koji treba obrisati. Sljedeći program to ilustrira:

#uključi

#include

korištenjem imenski prostor std ;



int glavni ( )

{

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



vektor < char > :: iterator iter = vtr. početi ( ) ;

++ iter ; ++ iter ;



vektor < char > :: iterator to = vtr. izbrisati ( iter ) ;



za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ ) {

cout << vtr [ ja ] << ' ' ;

}

cout << endl ;



cout << * to << endl ;



povratak 0 ;

}

Izlaz je:

P Q S T U

S

'R' je izbrisano. Vraćeni iterator sada pokazuje na 'S', koje je bilo odmah nakon 'R'. Funkcija članica, begin(), vraća iterator koji pokazuje na prvi element vektora. U kodu je ovaj iterator povećan dva puta kako bi pokazao na 'R'. 'R' je izbrisano izrazom 'vtr.erase(iter)'.

Raspon u vektoru

Za popis,

'P' , 'Q' , 'R' , 'S' , 'T' , 'U'

niz, 'Q', 'R', 'S', 'T' je raspon. Međutim, kod C++ spremnika, posljednji element, 'T' ne smatra se dijelom raspona. Ovo je općenito naznačeno kao:

[ i J )

ili

[ q1, q2 )

‘[’ u ovom slučaju znači da je prvi element u nizu uključen, a ‘)’ znači da posljednji element nije uključen.

brisanje iteratora (const_iterator prvi, const_iterator zadnji)

Ovo je potpuna sintaksa za 'a.erase(q1,q2)'. Vraća iterator koji pokazuje na element koji je bio odmah iza izbrisanog raspona. Napomena: zadnji element u rasponu se ne briše. Dakle, vraćeni iterator pokazivat će na posljednji element raspona. Argumenti q1 i q2 su iteratori koji pokazuju na prvi i posljednji element raspona. Sljedeći program to ilustrira:

#uključi

#include

korištenjem imenski prostor std ;



int glavni ( )

{

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



vektor < char > :: iterator itB = vtr. početi ( ) ;

++ itB ;

vektor < char > :: iterator itE = vtr. kraj ( ) ;

-- itE ; -- itE ;



vektor < char > :: iterator to = vtr. izbrisati ( itB, itE ) ;



za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ ) {

cout << vtr [ ja ] << ' ' ;

}

cout << endl ;



cout << * to << endl ;



povratak 0 ;

}

Izlaz je:

P T U

T

‘Q’, ‘R’, ‘S’ su izbrisani. Vraćeni iterator sada pokazuje na 'T', koji je bio zadnji element u rasponu spremnika. Funkcija članica, end(), vraća iterator koji pokazuje neposredno nakon zadnjeg elementa vektora. U kodu je ovaj iterator smanjen dva puta kako bi pokazao na 'T', posljednji element raspona. ‘Q’, ‘R’, ‘S’ su izbrisani bez zadnjeg elementa, ‘T’ u rasponu, s izrazom, “vtr.erase(itB, itE)”.

const vektor i erase()

Ako deklaraciji vektora prethodi const, za konstantu, tada se nijedan njegov element ne može izbrisati. Sljedeći program se neće kompilirati, izdajući poruku o pogrešci za izraz a.erase(q):

#uključi

#include

korištenjem imenski prostor std ;



int glavni ( )

{

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



vektor < char > :: const_iterator iter = vtr. početi ( ) ;

++ iter ; ++ iter ;



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



za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ ) {

cout << vtr [ ja ] << ' ' ;

}

cout << endl ;



cout << * to << endl ;



povratak 0 ;

}

Da je čitatelj isprobao program, dobio bi poruku o pogrešci. Program ne bi bio kompajliran.

Sljedeći program se neće kompilirati, izdajući poruku o pogrešci za a.erase(q1,q2) izraz:

#uključi

#include

korištenjem imenski prostor std ;



int glavni ( )

{

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



vektor < char > :: const_iterator itB = vtr. početi ( ) ;

++ itB ;

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

-- itE ; -- itE ;



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



za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ ) {

cout << vtr [ ja ] << ' ' ;

}

cout << endl ;



cout << * to << endl ;



povratak 0 ;

}

Napomena: erase() briše element ili niz elemenata. Zapravo, označava element kao izbrisan, tako da njihove memorijske lokacije mogu biti zauzete drugim kodovima. Ako memorijska lokacija bilo kojeg elementa još nije zauzeta drugim kodom, tada se element još uvijek može ponovno koristiti u ime istog vektora.

pop_back()

Vektorska funkcija član pop_back() je vrsta funkcije erase(). Međutim, briše samo zadnji element vektora. Sintaksa je:

poništiti pop_back ( )

Ne uzima argumente i vraća void. Sljedeći program ilustrira njegovu upotrebu:

#uključi

#include

korištenjem imenski prostor std ;



int glavni ( )

{

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



vtr. pop_back ( ) ;



za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ ) {

cout << vtr [ ja ] << ' ' ;

}

cout << endl ;



povratak 0 ;

}

Izlaz je:

P Q R S T

Posljednji element, 'U' je uklonjen (izbrisan).

Uništavanje vektora

Može li se vektor uništiti? – Da! Međutim, kada se vektor uništi, brišu se svi njegovi elementi osim imena; što znači da se vektorska deklaracija još uvijek može ponovno koristiti, ali uz određenu nesigurnost. Sintaksa za uništavanje vektora je:

a.~X ( )

gdje je 'a' ime vektora. Sljedeći program to ilustrira:

#uključi

#include

korištenjem imenski prostor std ;



int glavni ( )

{

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



vtr.~vektor ( ) ;



vtr = { 'U' , 'U' , 'X' , 'I' , 'S' } ;



za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ ) {

cout << vtr [ ja ] << ' ' ;

}

cout << endl ;



vtr.~vektor ( ) ;



vtr. odgurnuti ( 'A' ) ;

vtr. odgurnuti ( 'B' ) ;

vtr. odgurnuti ( 'C' ) ;

vtr. odgurnuti ( 'D' ) ;

vtr. odgurnuti ( 'I' ) ;



za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ ) {

cout << vtr [ ja ] << ' ' ;

}

cout << endl ;

povratak 0 ;

}

Izlaz je:

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

s autorova računala, s nekim nepouzdanim znakovima za drugi redak.

Zaključak

Vektorska funkcija članica clear() može se usporediti s vektorskom funkcijom članicom erase(). Oni nisu zamjene. clear() briše sve elemente vektora. Zapravo, označava sve elemente kao izbrisane, tako da njihove memorijske lokacije mogu biti zauzete drugim kodovima. Ako memorijska lokacija bilo kojeg elementa još nije zauzeta drugim kodom, tada se element još uvijek može ponovno koristiti u ime istog vektora. erase() briše element ili niz elemenata. Zapravo, označava element kao izbrisan, tako da memorijsku lokaciju može zauzeti drugi kod. Ako memorijska lokacija bilo kojeg izbrisanog elementa još nije zauzeta drugim kodom, tada se element još uvijek može ponovno koristiti u ime istog vektora. jasno ima sličnost za uništavanje, ~X().