Napisałem więc sporo kodu, który uzyskuje dostęp do elementów w wektorze stl według indeksu [], ale teraz muszę skopiować tylko fragment wektora. Wygląda na vector.insert(pos, first, last)
to, że jest to funkcja, której chcę ... ale mam tylko pierwszą i ostatnią jako ints. Czy jest jakiś fajny sposób na uzyskanie iteratora tych wartości?
200
Odpowiedzi:
Spróbuj tego:
źródło
std::next(v.begin(), index)
sposób wspomniany przez @dirkgently
( v.begin() + index )
ładnie i szybko dla wektorówale najbardziej ogólny sposób i dla iteratorów o dostępie swobodnym działa również w stałym czasie.
std::advance
( v.begin(), index )
EDYTUJ
różnice w użyciu:
lub
dodane po notatkach @litb.
źródło
std::vector
, nie ma sensu używaćstd::advance
. To tylko zachęca cię do myślenia, że piszesz kod niezależny od kontenera (czego nie robisz, myśląc o regułach unieważniania iteratora, różnych złożonościach środowiska uruchomieniowego i tak dalej). Jedynym przypadkiem, gdystd::advance
ma to sens, jest samodzielne napisanie szablonu, który nie wie, z jakim typem iteratora ma do czynienia.Również;
auto it = std::next(v.begin(), index);
Aktualizacja: Potrzebuje kompilatora zgodnego z C ++ 11x
źródło
Lub możesz użyć
std::advance
źródło
W razie potrzeby std :: vector mają być używane jako tabulatory C. (Standard C ++ wymaga, aby o implementację wektorową, o ile mi wiadomo - zastąpienie tablicy w Wikipedii ) Na przykład, według mnie, jest to całkowicie legalne:
Oczywiście albo foo nie może kopiować adresu przekazanego jako parametr i przechowywać go gdzieś, albo powinieneś zadbać o to, aby twój program nigdy nie wypychał żadnego nowego elementu w vec, ani nie prosił o zmianę jego pojemności. Lub błąd segmentacji ryzyka ...
Dlatego w twoim przykładzie prowadzi to do
źródło