Nawet w najprostszym programie często używamy tablic.O zaletach tablic pisałem w innym artykule, niemniej podsumowując, łatwość operowania tablicami wynika m.in. z konieczności znania jedynie nazwy tablicy oraz indeksu komórki, do której chcemy się odwołać.Znając nazwę tablicy (a więc adres jej początku w pamięci) oraz dodając przesunięcie (w postaci indeksu tablicy) operujemy na wybranym elemencie tablicy.Podobnie sprawa ma się z vectorem, vector ma jednak więcej zastosowań od tablic oraz łatwiej się go używa.Należy także wspomnieć, że z punktu widzenia poprawności kodu, używanie vectora jest bardziej bezpieczne.
W przypadku zmiennych globalnych, po zakończeniu operacji na tym elemencie nie mamy pewności, co póĽniej będzie zawierać ów element.Dlatego zalecaną praktyką programistów jest wyczyszczenie tablicy (lub vectora) przed powtórnym użyciem.
Czyszczenie tablic
Przeanalizujmy poniższy kod
RichEdit1->Clear();
// wypelnianie tablicy
int tab[5];
int i=0;
while(i<=4)
{tab[i] = i + 1;
RichEdit1->Lines->Add(tab[i]);
i++;
}
// usuwanie tablicy
int ile = ARRAYSIZE(tab);
for(int i=0;i<ile;i++)
{tab[i] = 0;
RichEdit1->Lines->Add(tab[i]);
}
Label1->Caption = IntToStr(ile);
Tworzymy tablicę 5-elementową typu int oraz wypełniamy ją liczbami.W następnej części kodu wypełniamy ją zerami, a więc czyścimy.Ale w tym przypadku aby wyczyścić całą tablicę, musimy znać jej rozmiar.Rozmiar ten jest przechowywany w zmiennej
ile.
Efekt działania na RichEdit1 będzie następujący:
1
2
3
4
5
0
0
0
0
0
Czyszczenie elementów klasy vectorZadeklarujmy w programie zmienną globalną
vector <int> tab2(5);
Do jednej funkcji obsługi zdarzenia wklejmy następujący kod:
RichEdit2->Clear();
// wypelnianie vectora
int i=0;
while(i<=4)
{tab2.at(i) = i + 1;
RichEdit2->Lines->Add(IntToStr(tab2[i]));
i++;
}
// czyszczenie vectora
i=0;
tab2.clear();
while(i<=4)
{RichEdit2->Lines->Add(IntToStr(tab2[i]));
i++;
}
Label2->Caption = tab2.size();
Na początku tworzymy vector 5-elementowy typu int.Dalej wypełniamy go liczbami i wypisujemy zawartość vectora na RichEdit2.W 2 części programu używamy funkcji clear, która usuwa całą zawartość vectora.Co spostrzegawsi zauważą jednak, że wynik działania tego kodu jest następujący:
1
2
3
4
5
1
2
3
4
5
A więc za 2 razem nie został wyczyszczony vector???
Ależ został!
Wystarczy podpiąć pod inną funkcję obsługi zdarzenia kod wypisujący wszystkie elementy vectora
for(int i=0;i<5;i++)
{RichEdit2->Lines->Add(tab2.at(i));
}
ale tu już prawidłowo, vector zwraca błąd
out_of_range, jako że nic nie zawiera.
Dodatkowo, aby sprawdzić czy vector jest pusty, możemy skorzystać z funkcji
empty
if(tab2.empty())
Label3->Caption = "Pusty vector";
Wyjątek ten możemy przechwycić, umieszczając kod w pętli
try catch
(dodajemy w piku nagłówkowym
#include <stdexcept>)
try
{// kod
}
catch(std::out_of_range)
{//kod wyjatku
}