为什么我的代码在代码块上运行而不在Visual Studio上运行?

时间:2019-05-12 14:36:53

标签: visual-studio c++11 vector iterator codeblocks

我正在尝试在特定位置将值设置为向量,并删除旧值。 代码适用于代码块,但不适用于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;
    }
}

1 个答案:

答案 0 :(得分:0)

cppreferencestd::vector::erase()页面上

  

使擦除点或擦除点之后的迭代器和引用无效,包括end()迭代器。

所以当你写

    v.erase(it);
    v.insert(it, value);

第一条指令使it迭代器无效。 我想第二条指令是未定义的行为。

无论如何,您不能指望it之后的erase()

cppreferencestd::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;
}