C++ Vector Clear vs Erase

C Vector Clear Vs Erase



C++ vektoram ir daudz locekļu funkciju. Divi no tiem ir notīrīt () un izdzēst (). skaidrs () 'noņem' visus vektora elementus. erase() “noņem” vienu elementu vai elementu virkni. Ir divi vektora funkcijas erase() pārslogotie varianti.

Šī raksta nosaukums faktiski ir “Vector clear() Member Function pret Vector erase() Member Function, C++”. Šis ir divu dalībnieku funkciju salīdzinājums. Tas attiecas uz to, kad kuru lietot, kā un kādos apstākļos kāds tiek izmantots.







Lai C++ programmā izmantotu vektoru, programmai jāsākas ar:



#iekļaut

#include

izmantojot nosaukumvieta std ;

Raksta saturs

Vektors skaidrs()

Clear() locekļa funkcija “noņem” visus vektora elementus. Tās sintakse ir:



nederīgs skaidrs ( )

Tas atgriežas nederīgs. Šī programma ilustrē tās lietošanu ar izteicienu “vtr.clear();”:





#iekļaut

#include

izmantojot nosaukumvieta std ;



starpt galvenais ( )

{

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



priekš ( vektors < char > :: iterators to = vtr. sākt ( ) ; to ! = vtr. beigas ( ) ; to ++ )

cout << * to << '' ;

cout << endl ;



vtr. skaidrs ( ) ;



priekš ( vektors < char > :: iterators to = vtr. sākt ( ) ; to ! = vtr. beigas ( ) ; to ++ )

cout << * to << '' ;

cout << endl ;



atgriezties 0 ;

}

Izvade ir viena rinda:

P Q R S T U

Ja vektors nebūtu notīrīts, izvade būtu bijusi divas vienas un tās pašas secības rindas. Otrā rinda netika parādīta, jo visi elementi tika notīrīti.



const vektors un skaidrs ()

Ja pirms vektora deklarācijas ir const, tas nozīmē, ka vektora elementus nevar izdzēst vai mainīt. Ja izteiksme mēģina mainīt vai dzēst kādu no elementiem, programma netiks kompilēta. Pārbaudiet šo programmu un ņemiet vērā, ka tā netiek kompilēta:

#iekļaut

#include

izmantojot nosaukumvieta std ;



starpt galvenais ( )

{

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



priekš ( vektors < char > :: const_iterator to = vtr. sākt ( ) ; to ! = vtr. beigas ( ) ; to ++ )

cout << * to << '' ;

cout << endl ;



vtr. skaidrs ( ) ;



priekš ( vektors < char > :: const_iterator to = vtr. sākt ( ) ; to ! = vtr. beigas ( ) ; to ++ )

cout << * to << '' ;

cout << endl ;



atgriezties 0 ;

}

Ja programma tiktu pārbaudīta, tiktu parādīts kļūdas ziņojums un nebūtu veikta kompilācija. Tā kā vektors tika pasludināts par nemainīgu, funkcija clear () nevarēja darboties, kā rezultātā kompilators parāda kļūdas ziņojumu.

Piezīme: Clear() dzēš visus vektora elementus. Faktiski visi elementi tiek atzīmēti kā dzēsti, lai citi kodi varētu aizņemt to atmiņas vietas. Ja kāda elementa atmiņas vietu vēl nav aizņēmis cits kods, elementu joprojām var izmantot atkārtoti tā paša vektora vārdā.

Vektoru dzēšana

Divu erase() locekļu funkciju vienkāršotās sintakses ir šādas:

a. dzēst ( q )

un

a. dzēst ( q1, q2 )

kur a ir vektora nosaukums.

iteratora dzēšana (konst_iteratora pozīcija)

Šī ir “a.erase(q)” pilna sintakse. Tas atgriež iteratoru, kas norāda uz elementu, kas atradās tieši aiz izdzēstā. Arguments q ir iterators, kas norāda uz dzēšamo elementu. To ilustrē šāda programma:

#iekļaut

#include

izmantojot nosaukumvieta std ;



starpt galvenais ( )

{

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



vektors < char > :: iterators iter = vtr. sākt ( ) ;

++ iter ; ++ iter ;



vektors < char > :: iterators to = vtr. dzēst ( iter ) ;



priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ ) {

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

}

cout << endl ;



cout << * to << endl ;



atgriezties 0 ;

}

Izvade ir:

P Q S T U

S

“R” ir izdzēsts. Atgrieztais iterators tagad norāda uz “S”, kas bija tieši aiz “R”. Dalībnieka funkcija begin() atgriež iteratoru, kas norāda uz vektora pirmo elementu. Kodā šis iterators tika palielināts divas reizes, lai norādītu uz “R”. “R” tika izdzēsts ar izteicienu “vtr.erase(iter)”.

Diapazons vektorā

Attiecībā uz sarakstu,

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

secība 'Q', 'R', 'S', 'T' ir diapazons. Tomēr C++ konteineros pēdējais elements “T” netiek uzskatīts par diapazona daļu. Vispārīgi tas ir norādīts kā:

[ es, j )

vai

[ q1, q2 )

“[” šajā gadījumā nozīmē, ka ir iekļauts pirmais elements secībā, un “)” nozīmē, ka pēdējais elements nav iekļauts.

iterator erase (const_iterator pirmais, const_iterator pēdējais)

Šī ir “a.erase(q1,q2)” pilna sintakse. Tas atgriež iteratoru, kas norāda uz elementu, kas atradās tieši aiz izdzēstā diapazona. Piezīme: pēdējais elements diapazonā netiek izdzēsts. Tātad atgrieztais iterators norādīs uz pēdējo diapazona elementu. Argumenti q1 un q2 ir iteratori, kas norāda uz diapazona pirmo un pēdējo elementu. To ilustrē šāda programma:

#iekļaut

#include

izmantojot nosaukumvieta std ;



starpt galvenais ( )

{

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



vektors < char > :: iterators tasB = vtr. sākt ( ) ;

++ tasB ;

vektors < char > :: iterators itE = vtr. beigas ( ) ;

-- itE ; -- itE ;



vektors < char > :: iterators to = vtr. dzēst ( itB, itE ) ;



priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ ) {

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

}

cout << endl ;



cout << * to << endl ;



atgriezties 0 ;

}

Izvade ir:

P T U

T

“Q”, “R”, “S” ir svītroti. Atgrieztais iterators tagad norāda uz “T”, kas bija pēdējais elements konteinera diapazonā. Dalībnieka funkcija end() atgriež iteratoru, kas norāda tieši aiz pēdējā vektora elementa. Kodā šis iterators tika samazināts divas reizes, lai norādītu uz “T”, pēdējo diapazona elementu. “Q”, “R”, “S” tika dzēsti bez pēdējā elementa “T” diapazonā ar izteiksmi “vtr.erase(itB, itE)”.

const vektors un erase ()

Ja vektora deklarācijas priekšā ir konstante, tad nevienu no tā elementiem nevar izdzēst. Šī programma netiks kompilēta, izdodot kļūdas ziņojumu a.erase(q) izteiksmei:

#iekļaut

#include

izmantojot nosaukumvieta std ;



starpt galvenais ( )

{

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



vektors < char > :: const_iterator iter = vtr. sākt ( ) ;

++ iter ; ++ iter ;



vektors < char > :: const_iterator to = vtr. dzēst ( iter ) ;



priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ ) {

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

}

cout << endl ;



cout << * to << endl ;



atgriezties 0 ;

}

Ja lasītājs mēģinātu programmu, viņš būtu saņēmis kļūdas ziņojumu. Programma nebūtu apkopota.

Šī programma netiks kompilēta, izdodot kļūdas ziņojumu a.erase(q1,q2) izteiksmei:

#iekļaut

#include

izmantojot nosaukumvieta std ;



starpt galvenais ( )

{

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



vektors < char > :: const_iterator tasB = vtr. sākt ( ) ;

++ tasB ;

vektors < char > :: const_iterator itE = vtr. beigas ( ) ;

-- itE ; -- itE ;



vektors < char > :: const_iterator to = vtr. dzēst ( itB, itE ) ;



priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ ) {

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

}

cout << endl ;



cout << * to << endl ;



atgriezties 0 ;

}

Piezīme: erase() izdzēš elementu vai elementu diapazonu. Faktiski tas iezīmē elementu kā izdzēstu, lai to atmiņas vietas varētu aizņemt citi kodi. Ja kāda elementa atmiņas vietu vēl nav aizņēmis cits kods, elementu joprojām var izmantot atkārtoti tā paša vektora vārdā.

pop_back()

Pop_back() vektora locekļa funkcija ir sava veida funkcija erase(). Tomēr tas dzēš tikai pēdējo vektora elementu. Sintakse ir:

nederīgs pop_back ( )

Tas neprasa argumentus un atgriežas spēkā neesoši. Šī programma ilustrē tās izmantošanu:

#iekļaut

#include

izmantojot nosaukumvieta std ;



starpt galvenais ( )

{

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



vtr. pop_back ( ) ;



priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ ) {

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

}

cout << endl ;



atgriezties 0 ;

}

Izvade ir:

P Q R S T

Pēdējais elements “U” ir noņemts (izdzēsts).

Vektora iznīcināšana

Vai vektoru var iznīcināt? - Jā! Tomēr, ja vektors tiek iznīcināts, visi tā elementi tiek izdzēsti, izņemot tā nosaukumu; tas nozīmē, ka vektora deklarāciju joprojām var izmantot atkārtoti, taču ar zināmu nenoteiktību. Vektora iznīcināšanas sintakse ir:

a.~X ( )

kur “a” ir vektora nosaukums. To ilustrē šāda programma:

#iekļaut

#include

izmantojot nosaukumvieta std ;



starpt galvenais ( )

{

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



vtr.~vektors ( ) ;



vtr = { 'IN' , 'IN' , 'X' , 'UN' , 'AR' } ;



priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ ) {

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

}

cout << endl ;



vtr.~vektors ( ) ;



vtr. atgrūst ( 'A' ) ;

vtr. atgrūst ( 'B' ) ;

vtr. atgrūst ( 'C' ) ;

vtr. atgrūst ( 'D' ) ;

vtr. atgrūst ( 'UN' ) ;



priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ ) {

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

}

cout << endl ;

atgriezties 0 ;

}

Izvade ir:

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

no autora datora, ar dažām neuzticamām rakstzīmēm otrajā rindā.

Secinājums

Vektora locekļa funkciju clear() var salīdzināt ar vektora locekļa funkciju erase(). Tie nav aizstājēji. Clear() dzēš visus vektora elementus. Faktiski tas iezīmē visus elementus kā izdzēstus, lai to atmiņas vietas varētu aizņemt citi kodi. Ja kāda elementa atmiņas vietu vēl nav aizņēmis cits kods, elementu joprojām var izmantot atkārtoti tā paša vektora vārdā. erase() izdzēš elementu vai elementu diapazonu. Faktiski tas iezīmē elementu kā izdzēstu, lai atmiņas vietu varētu aizņemt cits kods. Ja kāda dzēstā elementa atmiņas vietu vēl nav aizņēmis cits kods, elementu joprojām var izmantot atkārtoti tā paša vektora vārdā. skaidram ir līdzība, lai iznīcinātu, ~ X().