【问题标题】:Vector iterator + offset out of range error thrown incorrectly向量迭代器 + 偏移超出范围错误抛出错误
【发布时间】:2018-04-16 23:50:13
【问题描述】:

我为不断发展的神经网络编写了代码,我的一个类具有以下成员函数:

bool Brain::makeLayer(int pos)
{
    int preSize = layers.size();

    layers.insert(layers.begin() + pos, std::vector<Cell*>{});

    return layers.size() > preSize;
 }

其中层定义为std::vector&lt;std::vector&lt;Cell*&gt;&gt; layers

我在layers.insert(layers.begin() + pos, std::vector&lt;Cell*&gt;{}); 线上收到错误vector + offset out of range

通过一些调试,layers的大小为1,pos也设置为1。

我已经尝试使用不同的 pos 值进行测试,如果直接调用 makeLayer(1) 会按预期工作...

它应该如何工作,对于大小为 1 的向量,layers.begin() + pos 应该等于 layers.end(),因此当在该位置调用 insert 时,它应该简单地在层的末尾插入一个 std::vector&lt;Cell*&gt;{} ,但它不会,而是抛出上述错误。

编辑:包含类Brain 保证对makeLayer() 的任何调用都将具有有效值pos 使得layers.begin() + pos 永远不会超过layers.end(),我的问题的症结是insert() 正在抛出在不可能的情况下出现错误。大小为 1 的 std::vector 永远不会在 layers.insert(layers.begin() + 1, val) 上失败,除非系统内存不足并且我的系统没有内存不足。

【问题讨论】:

  • 您是否尝试过创建一个最小且可重现的示例?
  • 此外,您真的应该断言()您的函数先决条件,以便尽早检查它们;否则,未定义的行为将无情地传播到天知道在哪里......
  • @Jodocus 我不能,我使用基本数据类型运行的每个测试都暗示我能够做到这一点,但事实并非如此......
  • 没有minimal reproducible example,只是错误消息的一部分...首先将您的行分成两行:auto it = layers.begin()+pos; layers.emplace(it);

标签: c++ c++11 vector iterator


【解决方案1】:

如果你想给std::vector附加一个值,你应该使用std::vector::push_back

你已经过度设计了,因为已经有一个功能可以达到这个目的。

编辑:我认为您遇到的问题是,当您添加 layers.begin() + pos 时,pos 可能大于 layers.size(),这就是为什么您甚至无法检查 layers.begin() + pos == layers.end(),您是递增迭代器越界。

【讨论】:

  • 我想在vector的某个位置添加一个新元素,在这个例子中恰好是1
  • 调试的时候有没有检查layers.begin() + pos的值是否真的是layers.end()
  • 每次我尝试检查layers.begin() + pos == layers.end()是否会抛出错误,所以我无法做到这一点
  • 这可能是因为pos 大于您的layers 向量大小。您正在“超越”迭代器。你也可以检查一下吗?
  • @Stephen 你不能,一个向量是连续的,你还需要添加所有中间的。
【解决方案2】:

这似乎解决了问题,但会产生更高的开销(原因很明显)。

bool Brain::makeLayer(int pos)
{
    int preSize = layers.size();

    layers = insert(layers, pos, std::vector<Cell*>{});

    return layers.size() > preSize;
 }

其中insert() 定义为:

template<typename T>
std::vector<T> insert(std::vector<T>tgt,int pos, T item) {
    std::vector<T> temp(tgt.size()+1);
    int tgtIndex = 0;

    if (pos > temp.size()) {
//this function is for debugging, first param is file name, then error message, then is the error fatal
        errorOut("Lib", "Cannot add element to vector because pos is out of range", true);
    }


    for (int i = 0; i < temp.size(); i++) {
        if (pos == i) {
            temp[i] = item;
        }
        else {
            temp[i] = tgt[tgtIndex];
            tgtIndex++;
        }
    }

    return temp;
}

【讨论】:

  • 这并不能解决任何问题,您可能只是将问题转移到其他地方等待再次咬您...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
相关资源
最近更新 更多