std::vector<std::string> 改为插入空字符串

std::vector<std::string> insert empty string instead

在 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 方法,在 vector class 的 _Insert(..) 方法中,它做了一些内存重新分配,内存 move/move 等等。

第一个 _Umove 调用将所有 7 个字符串移动到新分配的内存,我认为调用了 std::move,旧内存还剩下一些空字符串。

然后 _Ucopy 方法尝试复制 3 个项目,但是从旧内存中,结果附加了 3 个空字符串。 还有另一个 _Umove 调用,我不确定那是做什么用的。所有这些之后,旧内存被释放,新内存附加到向量。

使用像int这样的标量类型不会输出错误,因为内存被复制,没有调用std::move。

我是不是哪里做错了,还是 MS Visual Studio 的 STL 错误?

来自this std::vector::insert reference

Causes reallocation if the new size() is greater than the old capacity(). If the new size() is greater than capacity(), all iterators and references are invalidated

[强调我的]

您在使用迭代器迭代向量的同时向向量添加元素。由于这会导致向量被重新分配,因此您的迭代器将失效。这将导致未定义的行为