我正在尝试在特定位置将值设置为向量,并删除旧值。 代码适用于代码块,但不适用于Visual Studio。 visual studio会出现错误:矢量Emplace迭代器超出范围且矢量迭代器不兼容。
template <typename T>
T EndlessList<T>::setValue(T value)
{
it++;
if (it != v.end())
{
it--;
v.erase(it);
v.insert(it, value);
return *it;
}
else
{
v.push_back(value);
*it = value;
return *it;
}
}
答案 0 :(得分:0)
在cppreference的std::vector::erase()
页面上
使擦除点或擦除点之后的迭代器和引用无效,包括
end()
迭代器。
所以当你写
v.erase(it);
v.insert(it, value);
第一条指令使it
迭代器无效。
我想第二条指令是未定义的行为。
无论如何,您不能指望it
之后的erase()
。
在cppreference的std::vector::insert()
页面上
如果新的
size()
大于capacity()
,则所有迭代器和引用均无效。否则,只有插入点之前的迭代器和引用保持有效。过去的迭代器也无效。
因此,当it == v.end()
时,指令
v.push_back(value);
使it
无效并带有
*it = value;
return *it;
您再次使用了无效的迭代器。
简单
template <typename T>
T EndlessList<T>::setValue(T value)
{
it++;
if (it != v.end())
{
it--;
*it = value;
}
else
v.push_back(value);
return value;
}
?