2011-08-04 4 views
27

Załóżmy, że mamjak dostać iterator do konkretnego położenia wektora

std::vector<int> v 
//and ... 
for(int i =0;i<100;++i) 
v.push_back(i); 

teraz chcę iterator do, powiedzmy, 10-element wektora.

nie robiąc następujące podejście

std::vector<int>::iterator vi; 
vi = v.begin(); 
for(int i = 0;i<10;i++) 
    ++vi; 

jak to zepsuje zaletę losową iterator dostępu do wektora.

+0

Możliwy duplikat [wektorów C++ STL: pobierz iterator z indeksu?] (Http://stackoverflow.com/questions/671423/c-stl-vectors-get-iterator-od-index) –

Odpowiedz

35

Po prostu dodaj 10 do iteratora. Mają one "czuć się" jak wskaźniki.

+0

dzięki ... to było pomocne –

+1

Nie chcesz dodać 9? Dodawanie 0 ruchów do pierwszego elementu, Dodanie 1 ruchów do drugiego elementu, ... Dodawanie ruchów n-1 do n-tego elementu. – Shillard

+0

To jest śliskie. :-) –

46

To będzie działać z każdym iterator o dostępie swobodnym, jak jeden z vector lub deque:

std::vector<int>::iterator iter = v.begin() + 10; 

Jeśli chcesz rozwiązanie, które będzie pracować dla każdego typu iteracyjnej, użyj next:

std::vector<int>::iterator iter = std::next(v.begin(), 10); 

Albo jeśli nie jesteś w C++ 11 realizacji, advance:

std::vector<int>::iterator iter = v.begin(); 
std::advance(iter, 10); 
+0

dzięki ... rite teraz tylko dodając 10 prac dla mnie. Ale wezmę pod uwagę zaliczkę. –

+1

Wolałbym std :: advance(), ponieważ działa z dowolnym iteratorem; w ten sposób nie jesteś przywiązany do konkretnego pojemnika. –

+0

@Matt: Najprawdopodobniej, jeśli twój algorytm wymaga dostępu do n-elementów, byłby on bezużytecznie nieefektywny z czymkolwiek poza iteratorami dostępu losowego; więc lepiej byłoby użyć 'operator +' zamiast 'std :: advance' i uzyskać błąd kompilatora z niewłaściwym typem iteratora. – ildjarn