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
[强调我的]
您在使用迭代器迭代向量的同时向向量添加元素。由于这会导致向量被重新分配,因此您的迭代器将失效。这将导致未定义的行为。
在 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 oldcapacity()
. If the newsize()
is greater thancapacity()
, all iterators and references are invalidated
[强调我的]
您在使用迭代器迭代向量的同时向向量添加元素。由于这会导致向量被重新分配,因此您的迭代器将失效。这将导致未定义的行为。