Проблема с std::vector::insert()

Есть следующий код:

static std::vector<const char*> vec = {"str1","str2","str3","str4"};

есть также

static std::string tempstring;

При первом проходе(первый вызов функции);

я записываю в tempstring значение одного из vec,например vec[3], что равно "str4".

и делаю

vec.erase(iterator + 3);

Элемент откуда надо удаляется.

Значения vec следующие: [0] = "str1",[1] = "str2",[2] = "str3";

На следующем проходе (второй раз вызов функции) я делаю следующее:

vec.insert(iterator+3,tempstring.c_str());

В vec в данный момент значения получаются такими: [0] = "str1",[1] = "str2",[2] = "str3",[3] = "str4". То есть все как задумано.Но как только я присваиваю значение в tempstring,например vec[0],что равно "str1". То есть tempstring = vec[0]; Сразу же меняется и сам vec.

То есть после присваивания значения вектора в tempstring значения становятся следующими: [0] = "str1",[1] = "str2",[2] = "str3",[3] = "str1".

В чем может быть проблема ?


Ответы (2 шт):

Автор решения: Free Login

Когда вы используете метод vector::insert() вы передаёте ссылку на переменную которую требуется добавить.

void insert (iterator position, size_type n, const value_type& val);

Метод insert не копирует данные из вашей строки в новую переменную, а вставляет ссылку от неё, как видно на снимке экрана:

Состояние вектора после добавления строки.

Следовательно после изменения строки изменится и значение соответствующего элемента в векторе.

→ Ссылка
Автор решения: Drawn Raccoon

tempstring.c_str() возвращает указатель не на новою строку, а на буфер tempstring в котором храниться строка, следовательно вы добавляете в вектор указатель на буфер tempstring. Если вдруг вы зададите tempstring строку побольше и произойдёт перевыделение буфера, то обращение к vec[3] будет являться неопределённым поведением, т.к. память по данному указателю уже будет недействительна. Решением будет использовать vector<const string>

→ Ссылка