有一个关于如何在c ++中简化一些代码的问题。
所以我们在CS课程中给出了这个实验,我们必须根据输入文件生成一个大句子,将读取行存储在字符串列表的列表中(哇!)。我们必须使用递归函数进行搜索。
所以map键是一个字符串。第一个列表是一组行,第二个列表是从文件中解析的字符串集合。
map<string, list<list<string> > >
我需要深入到字符串列表,将其重建为一个字符串。我已经设置了一些迭代器来实现它,但是当它到达我的迭代器声明时,我得到了一个“分段错误11”。
“语法”是一个已经给出输入并通过引用传递的地图。
“Incomplete”是一个字符串,等于传递给函数的键。
代码段:
string found = "";
map<string, list<list<string> > >::iterator section = grammar.find(incomplete);
list<list<string> > listItem = section->second;
list<list<string> >::iterator lIt = listItem.begin();
srand(time(NULL));
++lIt;
advance (lIt, rand() % listItem.size());
list<string> stringItem = *lIt;
while (stringItem.empty() == false){
found = found + " " + stringItem.front();
stringItem.pop_front();
}
解释rand()的需要:我们的第一个列表有多个列表,我们随机选择一个列表来生成句子。我是否正确使用过它?
它在这里停了下来。我确信有一种更简单的方法可以找到该列表,但我似乎无法弄清楚,而且我猜我正在消耗大量内存来声明所有这些如果“分段错误11 “正在被抛出。有什么建议吗?
答案 0 :(得分:0)
可能会有更多问题,但有两个显而易见的问题:
您不检查grammar.find(incomplete);
是否实际找到了一个元素。如果搜索失败,则返回grammar.end()
,其余部分就会爆炸。
您尝试查找随机元素的方法存在问题:
list<list<string> >::iterator lIt = listItem.begin();
*lIt
现在是listItem
中的第一个列表。
++lIt;
*lIt
现在是listItem
中的第二个列表。
advance (lIt, rand() % listItem.size());
这可能会尝试将迭代器推得太远。如果您的列表大小为n
,则您最多可以前进n-2
步,否则您将超过结尾。但rand() % n
可以是n-1
。