Проблема с 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 шт):
Когда вы используете метод vector::insert() вы передаёте ссылку на переменную которую требуется добавить.
void insert (iterator position, size_type n, const value_type& val);
Метод insert не копирует данные из вашей строки в новую переменную, а вставляет ссылку от неё, как видно на снимке экрана:
Следовательно после изменения строки изменится и значение соответствующего элемента в векторе.
tempstring.c_str() возвращает указатель не на новою строку, а на буфер tempstring в котором храниться строка, следовательно вы добавляете в вектор указатель на буфер tempstring. Если вдруг вы зададите tempstring строку побольше и произойдёт перевыделение буфера, то обращение к vec[3] будет являться неопределённым поведением, т.к. память по данному указателю уже будет недействительна. Решением будет использовать vector<const string>
