2010-02-28 7 views
11

Obecnie używam iteratora do przeszukiwania wektora i testowania jego elementów. Mam dostęp do elementów za pomocąCzy mogę wykonać arytmetykę wskaźnikową na STL :: vector :: iterator

std::vector<int>::iterator it; 
if (*it == 0); 

Czy mogę korzystać z tego samego wskaźnik arytmetyczną stylu logikę również testować następny element (bez zmieniania mojego iterator)?

ja najpierw trzeba sprawdzić, czy będzie ona naciskać iterator poza granicami

if (it != myvec.end()) 

Następnie przetestować zarówno bieżący element i następny element

if (*it == 1 && *(it + 1) == 1) 

To działa jak oczekuję od stosując wskaźniki?

Odpowiedz

16

Tak, iteratory dla std::vectorrandom access iterators, więc dodaj/odejmij wartości integralne, aby uzyskać inne poprawne iteratory.

Technicznie może to nie być arytmetyka wskaźnikowa, ale działają one jak wskaźniki.

+0

Tak, nie mogę wykonywać operacji arytmetycznych na 'list :: iterator', prawda? – Alcott

+1

@Alcott - poprawny. Iterator list :: iterator jest dwukierunkowy i nie obsługuje dostępu losowego. Możesz użyć 'std :: advance', aby wykonać ruch za pomocą pojedynczego wywołania, ale złożoność zaawansowania to' O (n) 'dla list (gdzie to byłoby' O (1) 'dla wektora). –

3

To zadziała w rzeczy samej, ponieważ iterator wektorowy jest iteratorem dostępu swobodnego. To nie tylko możesz działać na nich tak, jakbyś robił to za pomocą wskaźników, ale są one w dużym stopniu implementowane za pomocą wskaźników/wskaźników arytmetycznych.

1

Dobrze, jeśli iterator jest na ostatnim elemencie pojemnika następnie

*(it + 1) 

jest niezdefiniowane zachowanie. Przed zamknięciem funkcji należy sprawdzić, czy przed wykonaniem tej funkcji należy sprawdzić, czy nie ma ona przedłużyć się.

+1

Tak samo jak przy użyciu wskaźników, musisz sprawdzić, czy nie wychodzi poza granice. – Dom

Powiązane problemy