Итак, я написал кучу кода, который обращается к элементам вектора stl по индексу [], но теперь мне нужно скопировать только часть вектора. Похоже, vector.insert(pos, first, last)
это функция, которую я хочу ... за исключением того, что у меня есть только первый и последний как целые. Есть ли хороший способ получить итератор для этих значений?
201
Ответы:
Попробуй это:
источник
std::next(v.begin(), index)
способ упомянутый @dirkgently
( v.begin() + index )
хорош и быстр для векторовно самый общий способ и для итераторов с произвольным доступом тоже работает постоянное время.
std::advance
( v.begin(), index )
РЕДАКТИРОВАТЬ
различия в использовании:
или
добавлено после @litb заметок.
источник
std::vector
, нет смысла использоватьstd::advance
. Это только заманивает вас к мысли, что вы пишете независимый от контейнера код (чего вы не делаете, думая о правилах аннулирования итераторов, различных сложностях во время выполнения и еще чего-то). Единственный случай, когда этоstd::advance
имеет смысл, - это когда вы сами пишете шаблон, который не знает, с каким итератором он работает.Также;
auto it = std::next(v.begin(), index);
Обновление: необходим компилятор, совместимый с C ++ 11x
источник
Или вы можете использовать
std::advance
источник
На самом деле std :: vector предназначены для использования в качестве вкладки C при необходимости. (Стандарт C ++ требует, чтобы для векторной реализации, насколько я знаю, замена для массива в Википедии ) Например, совершенно законно сделать следующее, по моему мнению:
Конечно, либо foo не должен копировать адрес, переданный в качестве параметра, и сохранять его где-либо, либо вы должны убедиться в том, что в вашей программе никогда не добавляется какой-либо новый элемент в vec или не запрашивается изменение его емкости. Или ошибка сегментации риска ...
Поэтому в вашем примере это приводит к
источник