2017-02-05 24 views
6

Załóżmy, że mamy tablicę o nazwie data o rozmiarze 5. Jeśli mijamy tę tablicę jako argument do funkcji std::end jakDlaczego wskazywać na lokalizację pamięci po ostatnim elemencie tablicy lub wektora?

int *ptr = std::end(data); 

Będzie zwracają wskaźnik wskazujący na lokalizację jednego za ostatnim elementem w tablicy pamięci.

Pytanie

Jaki jest sens posiadania wskaźnik wskazujący na lokalizację pamięci jeden obok ostatniego elementu w tablicy? Dlaczego nie wskazać ostatniego elementu w tablicy?

+4

Z powodu jednolitości. W ten sposób wszystkie iteratory zachowują się tak samo we wszystkich rodzajach różnych pojemników. A wiele kontenerów nie zapewnia dostępu losowego, jak to ma miejsce w tablicach i wektorach. To sprawi, że 'i! = J' będzie jedyną opcją, a' i DeiDei

+0

Ponieważ w C++ zazwyczaj wyrażasz zakresy z półzamkniętymi przerwami, które mają wiele dogodnych właściwości; w tym zapisie zakres obejmujący cały kontener to [początek, koniec], przy czym koniec jest jednym elementem po ostatnim. –

+0

Ułatwia to również sprawdzenie, czy zakres nie jest pusty: 'while (ptr! = End (data)) ...' –

Odpowiedz

7

Aby móc powiedzieć "pusty" kontener/sekwencję z jednym z elementami w nim.

Jeśli pojemnik jest pusty, wskaźnik do jego pierwszego elementu byłby jeden za końcem, taki sam jak położenie "końcowy".

Można również użyć wskaźnika, ponieważ iteratory są koniecznie wskaźnikami, NULL nie ma zastosowania. Można również użyć domyślnej wartości iteratora. W ogólnym programowaniu, w jaki sposób "domyślne" byłoby ustalane jednakowo we wszystkich typach (pamiętając o implementacjach Pre C++ 98)?

Nie wszystkie sekwencje/pojemniki są przyległe do pamięci, każda próba użycia porównania, takiego jak operator <, nie byłaby odpowiednia. Konieczne jest użycie równości (lub nierówności), operatorów == i !=, aby pojedynczy punkt (lub element) był potrzebny do wskazania ostatniego elementu; "jeden do końca" rozwiązuje to.

Dla jednolitości, "koniec" jest wybrany jako jeden koniec do końca; rozwiązuje wiele problemów i dostarcza mocy do STL. Półzamknięty interwał stał się normą w C++.

Na marginesie biblioteka zakresów i techniki świecą innym światłem w tej sprawie, ale nie było jej w pobliżu, gdy położono podstawę dla STL.

Kolejna uwaga boczna; nie wszystkie sekwencje są skorelowane z kontenerem, niektóre sekwencje, które są wymagane do iteracji, są tylko częścią oryginalnego kontenera lub sekwencji, półzamknięty przedział oferuje jednolitą technikę dostępu do sekwencji, niezależnie od tego, gdzie znajduje się w oryginalnym pojemniku /sekwencja.

Related.

+0

To mogło być jak iteratory Java i kolekcje. Null oznacza nie więcej. – Brandon

+1

@Bandon To nie działa, jeśli chcesz, powiedzmy, powtórzyć elementy 3-13 kontenera z 20 elementami, bez uprzedniego umieszczania ich w osobnym pojemniku. –