Czy możesz usunąć wektor w c++?

Czy możesz usunąć wektor w c++?

Tak! Tak, ale nie idzie bez ograniczeń. Istnieją dwa sposoby usunięcia wektora. Znowu nie idą bez ograniczeń. Jednym ze sposobów usunięcia wektora jest użycie destruktura wektora. W takim przypadku wszystkie elementy są usuwane, ale nazwa wektora nie jest usuwana. Drugim sposobem na usunięcie wektora jest po prostu pozwolenie mu z zakresem. Zwykle każdy nietatyczny obiekt zadeklarowany w zakresie umiera, gdy zniknie z zakresu. Oznacza to, że obiektu nie można uzyskać w zakresie gniazdowania (blok). Zakres gniazdowania to zewnętrzny zakres (blok). Zakres zagnieżdżony jest wewnętrznym zakresem, który wciąż jest częścią zainteresowania. Te dwa sposoby usunięcia wektora są omówione w tym artykule.

Aby użyć wektora w C ++, program powinien zacząć od:

#włączać
#włączać
za pomocą przestrzeni nazw Std;

Treść artykułu

  • Niszczenie wektora
  • Puść z zakresu
  • Wniosek

Niszczenie wektora

Każdy utworzony obiekt jest w pewnym zakresie. Wektor jest tworzony i niszczony w zakresie funkcji Main () w tej sekcji artykułu. Składnia do zniszczenia wektora to:

A.~ X ()

gdzie „A” to nazwa wektora, a x to nazwa klasy wektora. Wektor to struktura danych utworzona z klasy. Nazwa klasy wektorowej to „wektor”, ze wszystkimi znakami małymi literami. Jeśli nazwa wektora to VTR, wektor zostałby zniszczony,

vtr.~ wektor.

Poniższy program usuwa wektor:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

wektor vtr = „a”, „b”, „c”, „d”, „e”;
vtr.~ wektor ();
dla (int i = 0; i < vtr.size(); i++)
Cout << vtr[i] << ";

Cout << endl;
powrót 0;

Wyjście jest niczym, co wskazuje, że wszystkie elementy wektorowe, z wyjątkiem nazwy wektora, zostały wymazane. W porządku. Powyższe wyjście zostało wyświetlone przez odwołanie się do rzekomych elementów. Co jeśli wyjście jest wyświetlane za pomocą iteratora? Rozważ następujący program:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

wektor vtr = „a”, „b”, „c”, „d”, „e”;
wektor:: iterator it = vtr.zaczynać();
vtr.~ wektor ();
dla (to = to; to != vtr.koniec(); it ++)
Cout << *it << ";

Cout << endl;
powrót 0;

Wyjście jest nadal niczym. Na tym etapie można naprawdę stwierdzić, że po zniszczeniu wektora wszystkie jego elementy są zniszczone, z wyjątkiem nazwy.

Nazwa wektora nie zniszczona

Ponieważ nazwa wektora nie jest zniszczona za pomocą destruktora, nazwa może być nadal ponownie używana w tym samym zakresie. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

wektor vtr = „a”, „b”, „c”, „d”, „e”;
vtr.~ wektor ();
vtr = „f”, „g”, „h”, „i”, „j ';
dla (int i = 0; i < vtr.size(); i++)
Cout << vtr[i] << ";

Cout << endl;
powrót 0;

Wyjście to:

F g h i j

Oryginalna zawartość wektora miała 5 znaków. Wszystkie 5 elementów zostało wymazanych. Gdy nazwa wektora została ponownie wykorzystywana, nowe 5 znaków podano jako treść wektor. Wyjście pokazało, że nowa zawartość jest prawidłowa.

Jednak nadal istnieje niuans. Jeśli nowa zawartość jest podana za pomocą funkcji członka push_back (), dane wyjściowe może być niekompletne i mogą istnieć nowe znaki w wektorze. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

wektor vtr = „a”, „b”, „c”, „d”, „e”;
vtr.~ wektor ();
vtr = „v”, „w”, „x”, „y”, 'z';
vtr.~ wektor ();
vtr.push_back („f”);
vtr.push_back („g”);
vtr.push_back („h”);
vtr.push_back („i”);
vtr.push_back („j”);
dla (int i = 0; i < vtr.size(); i++)
Cout << vtr[i] << ";

Cout << endl;
powrót 0;

Wyjście to:

p ^ t e u g h i j

„F” brakuje w wyjściu, a są dziwne znaki. Początkowo zawartość wektora jest podawana za pomocą operatora przypisania. Wektor jest zniszczony, a nowa zawartość ponownie przypisana do operatora przypisania. Wektor zostaje zniszczony ponownie i tym razem treść jest podawana za pomocą funkcji członka push_back (). „F” brakuje w wyjściu, a są dziwne znaki. To wymaga wyjaśnienia:

Po zniszczeniu wektora wszystkie jego elementy są oficjalnie wymazane. To, co się dzieje, polega na tym, że elementy są po prostu uważane za nie należą do wektora z natychmiastowym skutkiem, a ich lokalizacje pamięci są przeznaczone jako wielokrotne użycie przez jakikolwiek inny kod, z efektem natychmiastowym. Jeśli ten schemat nie zostanie doskonale przeprowadzony wewnętrznie, tak jak w przypadku ostatniego programu powyżej, wówczas pojawią.

Conster wektor

Gdy deklaracja wektorowa jest poprzedzona const, dla stałej, nadal można ją zniszczyć, jak wyjaśniono powyżej. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

Conster wektor vtr = „a”, „b”, „c”, „d”, „e”;
vtr.~ wektor ();
dla (int i = 0; i < vtr.size(); i++)
Cout << vtr[i] << ";

Cout << endl;
powrót 0;

Wyjście to nic. Jednak w tym stanie (const wektor) żaden element nie można usunąć za pomocą funkcji członka Erase ().

Używając nazwy w zagnieżdżonym zakresie

Niszczenie wektora ~ wektorem niszczy zawartość (elementy), ale nie nazwa wektora. Nazwę może być nadal używana w wewnętrznym zakresie, który nadal jest częścią zainteresowania. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

wektor vtr = „a”, „b”, „c”, „d”, „e”;
vtr.~ wektor ();
if (1 == 1)
vtr = „k”, „l”, „m”, 'n', 'o';
dla (int i = 0; i < vtr.size(); i++)
Cout << vtr[i] << ";
Cout << endl;

powrót 0;

Wyjście to:

K l m n o

Uwaga: Jeśli nazwa wektora ma zostać ponownie wykorzystywana, nie należy go ponownie deklarować.

Puść z zakresu

Kiedy jakikolwiek zadeklarowany obiekt zniknie z jego zakresu, nie można go już uzyskać z zakresu. Oznacza to, że nie można już uzyskać do niego dostępu w zakresie gniazdowania. Można go jednak uzyskać w zagnieżdżonym zakresie. Zakres zagnieżdżony jest nadal częścią przedmiotowego zakresu.

Dostęp do i poza zasięgiem

Poniższy program ilustruje, w jaki sposób wektor jest dostępny w zakresie:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

if (1 == 1)
wektor vtr = „a”, „b”, „c”, „d”, „e”;
dla (int i = 0; i < vtr.size(); i++)
Cout << vtr[i] << ";
Cout << endl;

powrót 0;

Wyjście to:

A B C D E

Main () funkcja gniazduje zakres if-block. VTR zadeklarowane w zakresie if-block można uzyskać dostęp tylko w zakresie if-block. Nie można uzyskać do niego dostępu poza zakresem if-block. Nie można uzyskać do niego dostępu na zewnątrz w bloku funkcyjnym Main (), który gniazduje. Poniższy program nie zostanie skompilowany, ponieważ podjęto próbę dostępu do wektora poza jego zakresem:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

if (1 == 1)
wektor vtr = „a”, „b”, „c”, „d”, „e”;
dla (int i = 0; i < vtr.size(); i++)
Cout << vtr[i] << ";
Cout << endl;

Cout << vtr[1] << endl;
powrót 0;

Gdyby czytelnik próbował skompilować program, wydano by komunikat o błędzie.

Zakres zagnieżdżony

Zakres zagnieżdżony jest nadal częścią przedmiotowego zakresu. Poniższy program ilustruje, w jaki sposób można uzyskać dostęp do wektora w zagnieżdżonym zakresie:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

if (1 == 1)
wektor vtr = „a”, „b”, „c”, „d”, „e”;
if (1 == 1)
dla (int i = 0; i < vtr.size(); i++)
Cout << vtr[i] << ";
Cout << endl;


powrót 0;

Wyjście to:

A B C D E

Blok funkcji main () gniazduje pierwszy blok, który gniazduje drugi blok if. Wektor jest zadeklarowany w pierwszym bloku if. Dostęp do niego w zagnieżdżonym (wewnętrznym) if-block.

Podejście polegające na umrzeniu wektora, gdy wychodzi z zakresu, wygląda preferowane w porównaniu z użyciem destrutora. Kiedy wektor wychodzi z zakresu, jego nazwa również umiera. Jednak nie cały czas programista chciałby umrzeć wektor, wychodząc z zakresu. Tak więc destruktor będzie musiał być używany od czasu do czasu. W obie strony mają swoje ograniczenia.

Wniosek

Jednym ze sposobów usunięcia wektora jest użycie destruktura wektora. W takim przypadku wszystkie elementy są usuwane, ale nazwa wektora nie jest usuwana. Drugim sposobem na usunięcie wektora jest po prostu pozwolenie mu z zakresem. Zwykle każdy nietatyczny obiekt zadeklarowany w zakresie umiera, gdy zniknie z zakresu. Oznacza to, że obiektu nie można uzyskać w zakresie gniazdowania (blok). Zakres gniazdowania to zewnętrzny zakres (blok). Można go jednak uzyskać w zagnieżdżonym zakresie. Zakres zagnieżdżony jest wewnętrznym zakresem, który wciąż jest częścią zainteresowania. Oba sposoby mają ograniczenia. Wektor w wewnętrznym zakresie nie musi być niszczony wektorem, zanim pozwoli mu umrzeć z zakresu.