szukanie elementu w vectorze z wartownikiem + nullptr

Brzmi groźnie. Wartownik. Czego on pilnuje? I tak myśląc po kolei można dojść do wniosku, że wartownik w strukturach danych wcale nie jest taki groźny, a wręcz przyjacielski 🙂 Żeby było ciekawiej, pokażę jak wygląda prosty przykład z użyciem vectora z bliblioteki STL.
#include <iostream>
#include <vector>
int main()
{
std::vector < int > tablica = {1, 2, 3, 4, 5}; // definicja vectora przez listę inicjalizacyjną
int szukana = 4; // tej poszukamy
tablica.push_back(NULL); // to jest wartownik wstawiony na koniec vectora z wartością NULL
for(int i = 0; i < tablica.size(); i++)
{
if (tablica[i] == szukana)
{
std::cout << "Znaleziono na pozycji " << i + 1 << std::endl;
break;
}
if (tablica[i] == NULL)
std:: cout << "Nie znaleziono " << std::endl;
}
return 0;
}
Dla zmiennej „szukana” z wartością 4 wyświetli się komunikat „Znaleziono na pozycji ” i poda numer pozycji, na której znajduje się wartość 4.
Jeśli zmieni się wartość zmiennej „szukana” na taką, która jest poza zbiorem vectora (czyli mniejsza od 1 lub większa od 5), w konsoli wyświetli się komunikat „Nie znaleziono”, ponieważ program sprawdzi każdy element vectora aż dojdzie do wartownika. Przykładem takiego wartownika jest znak NULL (/0) na końcu łańcucha string, który mówi programowi o tym, że to już koniec tekstu i dalej ma nie szukać znaków. Jeśli kompilator nie posiada w standardzie NULLa, można go dodać przez dyrektywę preprocesora:
#define NULL 0
Od C++11 jest dostępne natywne słowo kluczowe nullptr (null pointer), jednak nie zawsze kompilator jest skonfigurowany tak, aby działać w standardzie cpp0x. Jeśli kompilator wyrzuci błąd „nullptr was not declared in this scope” lub coś w tym stylu, to znaczy, że kompilator wymaga ingerencji w konfigurację. Zazwyczaj kończy się to jednym kliknięciem w ustawieniach lub odpowiednią dyrektywą. Przykład użycia nullptr:
#include <iostream>
int main()
{
int a = 1;
int *aPtr = &a;
std::cout << aPtr << std::endl;
aPtr = nullptr;
std::cout << aPtr << std::endl;
}
cout wyświetla aktualny adres, na który wskaźnik wskazuje. Po kompilacji i uruchomieniu wyświetli się najpierw adres zmiennej a, później 0 ustawione przez nullptr.
nullptr // c++11
NULL // c++98
lista inicjalizaycjna vectora // c++11