矢量迭代器+偏移超出范围错误抛出错误

时间:2017-11-04 09:49:49

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

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

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

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

    return layers.size() > preSize;
 }

其中图层定义为std::vector<std::vector<Cell*>> layers

我在第vector + offset out of range

上收到错误layers.insert(layers.begin() + pos, std::vector<Cell*>{});

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

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

如果它应该如何工作,layers.begin() + pos对于大小为1的向量应该等于layers.end(),因此当在该位置调用insert时,它应该只是插入{std::vector<Cell*>{} 1}}在图层的末尾,但它没有,而是抛出上述错误。

修改:包含的内容Brain可确保对makeLayer()的任何调用都具有有效值pos,以使layers.begin() + pos永远不会超过layers.end(),这是关键我的问题是insert()在不可能的情况下抛出错误。大小为1的std::vector永远不会在layers.insert(layers.begin() + 1, val)上失败,除非系统内存不足并且系统内存不足。

2 个答案:

答案 0 :(得分:0)

如果要将值附加到std::vector,则应使用std::vector::push_back

你已经过度工程了,因为已有一个功能用于此目的。

编辑:我认为您遇到的问题是,当您添加layers.begin() + pos时,pos可能大于layers.size(),这就是为什么您甚至无法检查{{1}你将迭代器增加到界限之外。

答案 1 :(得分:0)

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

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