Итак, я написал кучу кода, который обращается к элементам в stl-векторе по индексу [], но теперь мне нужно скопировать только кусок вектора. Похоже, что vector.insert(pos, first, last)
- это функция, которую я хочу... кроме того, что у меня есть только первый и последний как int. Есть ли хороший способ получить итератор для этих значений?
С++ STL Vectors: получить итератор из индекса?
Ответ 1
Попробуйте следующее:
vector<Type>::iterator nth = v.begin() + index;
Ответ 2
способ, упомянутый @dirkgently ( v.begin() + index )
приятный и быстрый для векторов
но std::advance
( v.begin(), index )
самый общий способ, и для итераторов с произвольным доступом также работает постоянное время.
ИЗМЕНИТЬ
различия в использовании:
std::vector<>::iterator it = ( v.begin() + index );
или
std::vector<>::iterator it = v.begin();
std::advance( it, index );
добавлен после примечаний @litb.
Ответ 3
Также; auto it = std::next(v.begin(), index);
Обновление: требуется компилятор, совместимый с С++ 11x
Ответ 4
Или вы можете использовать std::advance
vector<int>::iterator i = L.begin();
advance(i, 2);
Ответ 5
Actutally std::vector предназначены для использования в качестве вкладки 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]);