访问没有字符的字符串的第一个字符 我在C++中实现后缀TIE。Trie构造函数的实现如下所示 #包括 #包括 #包括“Trie.hpp” 使用名称空间std; Trie::Trie(字符串T){ T+=“#”;//终止字符 这个->T=T; nodes.reserve(T.length()*(T.length()+1)/2);//节点数以n(n+1)/2为界。reserve防止重新分配(http://stackoverflow.com/questions/41557421/vectors-and-pointers/41557463) 向量后缀;//后缀向量 for(无符号整数i=0;ichildLoc(后缀[0].at(0)); //如果没有这样的边缘,添加单词的其余部分 如果(边索引==-1){ addWord(currentNode,后缀[0]);//添加单词的其余部分 suffix.erase(suffix.begin());//从后缀向量中删除后缀 } //如果有 否则{ currentNode=(currentNode->getEdge(edgeIndex))->getTo();//当前节点是下一个节点 后缀[0]=后缀[0]。substr(1,后缀[0]。长度());//删除第一个字符 } } } //此函数用于添加单词的其余部分 void Trie::addWord(节点*父节点,字符串字){ for(unsigned int i=0;igetLabel()+word.at(i));//添加一个标签为parent+标签为edge的节点 边e(word.at(i)、parent和nodes.back());//创建一条边,将父节点连接到我们刚才添加的节点 parent->addEdge(e);//用这条边连接这两条边 } }

访问没有字符的字符串的第一个字符 我在C++中实现后缀TIE。Trie构造函数的实现如下所示 #包括 #包括 #包括“Trie.hpp” 使用名称空间std; Trie::Trie(字符串T){ T+=“#”;//终止字符 这个->T=T; nodes.reserve(T.length()*(T.length()+1)/2);//节点数以n(n+1)/2为界。reserve防止重新分配(http://stackoverflow.com/questions/41557421/vectors-and-pointers/41557463) 向量后缀;//后缀向量 for(无符号整数i=0;ichildLoc(后缀[0].at(0)); //如果没有这样的边缘,添加单词的其余部分 如果(边索引==-1){ addWord(currentNode,后缀[0]);//添加单词的其余部分 suffix.erase(suffix.begin());//从后缀向量中删除后缀 } //如果有 否则{ currentNode=(currentNode->getEdge(edgeIndex))->getTo();//当前节点是下一个节点 后缀[0]=后缀[0]。substr(1,后缀[0]。长度());//删除第一个字符 } } } //此函数用于添加单词的其余部分 void Trie::addWord(节点*父节点,字符串字){ for(unsigned int i=0;igetLabel()+word.at(i));//添加一个标签为parent+标签为edge的节点 边e(word.at(i)、parent和nodes.back());//创建一条边,将父节点连接到我们刚才添加的节点 parent->addEdge(e);//用这条边连接这两条边 } },c++,runtime-error,suffix-tree,suffix-array,suffix,C++,Runtime Error,Suffix Tree,Suffix Array,Suffix,我正在使用两种数据结构,Node和Edge,它们具有一些您期望的getter和setter以及属性。方法childLoc()返回表示给定字符的边(如果存在)的位置 代码编译得很好,但出于某种原因,我在运行时遇到了以下错误: terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::at: __n (which is 0) >= this->size() (wh

我正在使用两种数据结构,
Node
Edge
,它们具有一些您期望的getter和setter以及属性。方法
childLoc()
返回表示给定字符的边(如果存在)的位置

代码编译得很好,但出于某种原因,我在运行时遇到了以下错误:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::at: __n (which is 0) >= this->size() (which is 0)
Aborted (core dumped)

有人告诉我,这个错误意味着我正在访问空字符串的第一个字符,但我看不出代码中发生了什么

我发现两个代码部分可能导致
std::out\u超出范围

第一:以下表达式可能访问位置
0
处的空字符串。这可能发生在(如第二部分所示)收缩
后缀
-向量中包含的字符串时:

int edgeIndex = currentNode->childLoc(suffix[0].at(0));
其次,对
后缀
-vector中的条目进行操作,可能会导致字符串变短:

suffix[0] = suffix[0].substr(1, suffix[0].length()); 
如果第一个操作数(即
pos
-参数)超过数组长度(cf.),则操作
substr
也将产生
std::out_of_range

pos
:作为子字符串复制的第一个字符的位置。如果 这等于字符串长度,函数返回空值 一串如果该值大于字符串长度,则抛出 超出范围。注意:第一个字符由值0表示 (不是1)


为了找出这些表达式中的哪一个是导致异常的真正原因,我建议您咨询调试器:-)

您是否使用调试器调试了代码?e、 g.使用g++使用'-g'标志编译,然后使用基于gdb的调试器单步执行代码…如果不能够编译示例,很难帮助您处理运行时错误。您应该在调试程序的帮助下逐步完成代码。如果您想要一个答案,您将需要减少示例并提供产生问题的输入数据。看看如何制作一个有用的例子,吸引更多的答案。所以,在某个地方,你把没有香肠串和没有香肠串混淆了。容易做到,因为和性病:;字符串不能为空,与C字符*@MalcolmMcLean不同,您能澄清一下吗?关于第一句话,最后一个字符串的长度不是按
t.length()-(t.length-1)
=1吗?@Luke Collins:是的,您是对的。我相应地修改了答案。@LukeCollins
后缀[0]。substr(1,后缀[0]。length())
将无法处理1个字符的字符串,因为索引1中没有字符。对于每个字符串,它也将失败,因为length参数是字符串的完整长度,但是您从索引1开始,因此字符串溢出1。如果您想获取从字符索引开始的字符串,只需省去长度参数就更容易了。ie:
s.substr(1)
获取第一个字符后的所有内容,假设字符串有多个字符开头。@ebyrob:string::substr的长度过大不是问题;这只是一个最大值。但你是对的,单参数版本更好。@ebyrob谢谢你。但是按照它的编写方式,后缀[0].substr(1,后缀[0].length())不应该为1个字符的字符串运行否?