从字符串列表的列表中获取字符串

时间:2013-02-07 19:04:45

标签: c++ string list map

有一个关于如何在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 “正在被抛出。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

可能会有更多问题,但有两个显而易见的问题:

  1. 您不检查grammar.find(incomplete);是否实际找到了一个元素。如果搜索失败,则返回grammar.end(),其余部分就会爆炸。

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

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

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

    ++lIt;

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

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

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

相关问题