C ++ STL Векторы: Получить итератор из индекса? - PullRequest
185 голосов
/ 22 марта 2009

Итак, я написал группу кода, которая обращается к элементам вектора stl по индексу [], но теперь мне нужно скопировать только часть вектора. Похоже, vector.insert(pos, first, last) - это та функция, которую я хочу ... за исключением того, что у меня только первый и последний как целые. Есть ли хороший способ получить итератор для этих значений?

Ответы [ 5 ]

263 голосов
/ 22 марта 2009

Попробуйте это:

vector<Type>::iterator nth = v.begin() + index;
79 голосов
/ 22 марта 2009

способ упомянутый @dirkgently ( v.begin() + index ) хороший и быстрый для векторов

но std::advance( v.begin(), index ) самый общий способ и для итераторов с произвольным доступом тоже работает постоянное время.

EDIT
различия в использовании:

std::vector<>::iterator it = ( v.begin() + index );

или

std::vector<>::iterator it = v.begin();
std::advance( it, index );

добавлено после @litb notes.

45 голосов
/ 04 августа 2011

Также; auto it = std::next(v.begin(), index);

Обновление: необходим компилятор, совместимый с C ++ 11x

8 голосов
/ 23 августа 2009

Или вы можете использовать std::advance

vector<int>::iterator i = L.begin();
advance(i, 2);
0 голосов
/ 27 марта 2009

На самом деле std :: vector предназначены для использования в качестве вкладки C, когда это необходимо. (Стандарт C ++ требует, чтобы для векторной реализации, насколько я знаю - замена для массива в Википедии ) Например, это совершенно законно, по моему мнению:

int main()
{

void foo(const char *);

sdt::vector<char> vec;
vec.push_back('h');
vec.push_back('e');
vec.push_back('l');
vec.push_back('l');
vec.push_back('o');
vec.push_back('/0');

foo(&vec[0]);
}

Конечно, либо foo не должен копировать адрес, переданный в качестве параметра, и сохранять его где-либо, либо вы должны убедиться в том, что в вашей программе никогда не добавляется какой-либо новый элемент в vec или не запрашивается изменение его емкости. Или ошибка сегментации риска ...

Поэтому в вашем примере это приводит к

vector.insert(pos, &vec[first_index], &vec[last_index]);
...