1

有一个关于如何在 C++ 中简化一些代码的问题。

所以我们在我的 CS 课程中得到了这个实验室,我们必须根据输入文件生成一个大句子,将读取的行存储在字符串列表列表的映射中(哇!)。我们必须使用递归函数来搜索它。

所以映射键是一个字符串。第一个列表是行的集合,第二个列表是从文件中解析的字符串的集合。

map<string, list<list<string> > >

我需要深入到字符串列表以将其重构为一个字符串。我已经设置了一些迭代器来解决它,但是当它到达我的迭代器声明时,我得到了“分段错误 11”。

“语法”是已经给定输入并通过引用传递的映射。

“不完整”是一个字符串,等于传递给函数的键。

代码片段:

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”,我会消耗大量内存来声明所有这些"被抛出。有什么建议么?

4

1 回答 1

0

可能还有更多问题,但这里有两个明显的问题:

  1. 你不检查是否grammar.find(incomplete);真的找到了一个元素。如果搜索失败,它会返回grammar.end(),而你的其余部分可能会爆炸。

  2. 您尝试查找随机元素的方式存在问题:

list<list<string> >::iterator lIt = listItem.begin();

*lIt现在是第一个列表listItem

++lIt;

*lIt现在是 中的第二个列表listItem

advance (lIt, rand() % listItem.size());

这可能会尝试将迭代器推进得太远。如果您的列表大小是n您最多可以前进的n-2步骤,否则您会超出终点。但rand() % n可以n-1

于 2013-02-07T19:15:17.940 回答