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
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 ()
wektorvtr = „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 ()
wektorvtr = „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 ()
wektorvtr = „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 ()
wektorvtr = „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 wektorvtr = „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 ()
wektorvtr = „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)
wektorvtr = „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)
wektorvtr = „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)
wektorvtr = „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.