В Visual Studio 2013 я создал std::vector и сохранил в нем несколько строк. Затем я хочу сделать копию некоторой строки в векторе и добавить их в конец (допустим, переместить их в конец, после того, как вставка сделает стирание), но используя метод вставки, я увидел только пустые строки в конце, очень странный. Я воспроизвел его с помощью простого тестового кода,
std::vector<std::string> v;
std::string s = "0";
for (int i = 0; i < 7; ++i)
{
s[0] = '0' + i;
v.push_back(s);
}
v.insert(v.end(), v.begin(), v.begin() + 3);
for (std::string& s : v)
std::cout << "\"" << s.c_str() << "\" ";
Я получаю там "0" "1" "2" "3" "4" "5" "6" "" "" ""
Я отладил метод вставки, внутри метода _Insert(..) векторного класса, он сделал некоторое перераспределение памяти, перемещение/перемещение памяти и так далее.
Первый вызов _Umove перемещает все 7 строк в новую выделенную память, я думаю, что вызывается std::move, в старой памяти осталась пустая строка.
Затем методом _Ucopy попробуйте скопировать 3 элемента, но из старой памяти, в результате прикрепляются 3 пустые строки. Есть еще один вызов _Umove, я не уверен, для чего он нужен. После всего этого старая память освобождается, а новая память прикрепляется к вектору.
Использование скалярного типа, такого как int, не приводит к неправильному выводу, поскольку память копируется, а std::move не вызывается.
Я делаю что-то не так, или это ошибка MS Visual Studio STL?