Подтвердить что ты не робот

С++ вставить в вектор в известном положении

Я хочу вставить в вектор С++ в известном положении. Я знаю, что библиотека С++ имеет функцию insert(), которая занимает позицию, а объект для вставки, но тип позиции - итератор. Я хочу вставить в вектор, как я бы вставлял в массив, используя определенный индекс.

4b9b3361

Ответ 1

Посмотрите на эту отладочную трассировку. Последнее, что выполнено, - std:: copy (__ first = 0x90c6fa8, __last = 0x90c63bc, __result = 0x90c6878). Оглядываясь на то, что вызвало это, вы назвали вставку, в которой позиция была вставлена ​​как 0x90c63bc. std:: copy копирует диапазон [первый, последний] в результат, который должен иметь место для элементов последнего - первого. Этот вызов имеет последний < во-первых, это незаконно (!), поэтому я предполагаю, что позиция, которую вы даете вставить, неверна. Вы уверены, что vnum нигде не пересекается вдоль линии? В GDB с отображением этой трассы вы должны запустить

кадр 10

print vnum

чтобы проверить. На самом деле, если вы не просто сократили свой вопрос, я только что нашел вашу ошибку. Вторая строка:

new_mesh->Face(face_loc)->vertices.insert(vertices.begin()+vnum+1, new_vertices[j]);

Должно быть:

new_mesh->Face(face_loc)->vertices.insert(new_mesg->Face(face_loc)->vertices.begin()+vnum+1, new_vertices[j]);

Первая строка дает точку вставки относительно начала некоторой другой переменной, называемой вершинами, а не той, которую вы хотите вставить.

Ответ 2

Это должно делать то, что вы хотите.

vector<int>myVec(3);
myVec.insert(myVec.begin() + INTEGER_OFFSET, DATA);

Имейте в виду, что итераторы могут стать недействительными при перераспределении вектора. См. Этот сайт.

EDIT: Я не уверен, почему другой ответ исчез... но другой человек упомянул что-то вроде:

myVec.insert(INDEX, DATA);

Если я правильно помню, это должно быть прекрасно.

Ответ 3

Всегда приятно обернуть эти вещи:

template <typename T>
T& insert_at(T& pContainer, size_t pIndex, const T::value_type& pValue)
{
    pContainer.insert(pContainer.begin() + pIndex, pValue);

    return pContainer;
}

Это должно сделать это. Теперь есть удаленный ответ, что вы можете построить итератор из индекса, но я никогда этого не видел. Если это правда, это определенно путь; Я ищу его сейчас.