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

Pawel
  • Pawel

Leave a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *