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

时间:2016-11-21 14:13:13

标签: c++11 stl stdvector stdstring

在visual studio 2013中,我创建了一个std :: vector并在其中存储了一些字符串。然后我想在向量中复制一些字符串并将它们追加到最后(假设将它们移动到最后,插入后将擦除),但是使用insert方法,我最后只看到空字符串,非常奇怪。我用一些简单的测试代码重现了它,

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() << "\" ";

我得到的是什么 &#34; 0&#34; &#34; 1&#34; &#34; 2&#34; &#34; 3&#34; &#34; 4&#34; &#34; 5&#34; &#34; 6&#34; &#34;&#34; &#34;&#34; &#34;&#34;

我调试了insert方法,在vector类的_Insert(..)方法中,它做了一些内存重新分配,内存移动/移动等等。

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

然后_Ucopy方法尝试复制3个项目,但是从旧内存中,因此附加了3个空字符串。 还有另一个_Omove电话,我不知道是什么原因。在所有这些之后,旧的内存被释放,新的内存附加到向量。

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

我在这里做错了什么,或者它是MS Visual Studio的STL错误?

1 个答案:

答案 0 :(得分:1)

来自this std::vector::insert reference

  

如果新size()大于旧capacity(),则会导致重新分配。如果新size()大于capacity(),则所有迭代器和引用均无效

[强调我的]

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