【发布时间】: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<std::vector<Cell*>> layers
我在layers.insert(layers.begin() + pos, std::vector<Cell*>{}); 线上收到错误vector + offset out of range
通过一些调试,layers的大小为1,pos也设置为1。
我已经尝试使用不同的 pos 值进行测试,如果直接调用 makeLayer(1) 会按预期工作...
它应该如何工作,对于大小为 1 的向量,layers.begin() + pos 应该等于 layers.end(),因此当在该位置调用 insert 时,它应该简单地在层的末尾插入一个 std::vector<Cell*>{} ,但它不会,而是抛出上述错误。
编辑:包含类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);。