为何vector::resize(0)抛出‘vector too long’错误?LEMON库问题
LEMON库VectorMap构造时抛出“vector too long”错误的原因及解决办法
核心原因分析
空图状态导致maxId()返回-1
LEMON库中,当ListDigraph对象(比如你的g_origin)没有任何节点(空图),或所有节点被删除后,maxId()会返回-1,这是库的设计逻辑,用来标识当前无有效节点ID。类型转换引发的异常判断
你看到的container.resize(Parent::notifier()->maxId() + 1)代码中,maxId()返回的是有符号int类型的-1,计算-1 + 1得到int类型的0。但std::vector的resize()方法接受的是无符号size_t类型参数,在某些编译器/旧标准库的实现中,或LEMON内部的合法性检查逻辑里,会误将这个有符号转无符号后的0值识别为非法的超大数值,从而抛出“vector too long”错误。而ArrayMap能正常工作,是因为它的实现不依赖预分配节点ID范围,采用动态存储结构,无需在构造时根据maxId()预分配容器空间。
解决办法
- 确保创建NodeMap前图已包含节点:在执行
ListDigraph::NodeMap<int> g_volume(g_origin);之前,先通过g_origin.addNode()添加至少一个节点,让maxId()返回非负整数,此时maxId()+1会是合法的正整数,resize操作就能正常执行。 - 改用ArrayMap替代VectorMap:直接将代码改为
ListDigraph::NodeMap<int, ArrayMap> g_volume(g_origin);(或按LEMON语法直接声明ArrayMap类型的节点映射),利用ArrayMap的动态存储特性适配空图场景。 - 升级LEMON版本:如果使用的是较旧版本的LEMON,建议升级到最新稳定版,新版本可能修复了空图下VectorMap构造的类型转换bug。
内容的提问来源于stack exchange,提问作者Forzzig
相关产品推荐
相关产品推荐

