从字符串列表的映射中获取字符串 对如何在C++中简化一些代码提出了一个问题。

从字符串列表的映射中获取字符串 对如何在C++中简化一些代码提出了一个问题。,c++,string,list,map,C++,String,List,Map,在我的CS课程中,我们有一个实验,我们必须根据输入文件生成一个大句子,将读取的行存储在字符串列表的映射中!。我们必须使用递归函数来搜索它 所以映射键是一个字符串。第一个列表是行的集合,第二个列表是从文件解析的字符串的集合 map<string, list<list<string> > > 我需要深入到字符串列表,将其重建为一个字符串。我已经设置了一些迭代器来解决这个问题,但是当它到达我的迭代器声明时,我得到了一个分段错误11 语法是一个已经输入并通过引用传递

在我的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,我会消耗大量内存来声明所有这些。有什么建议吗?

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

不检查grammar.findincomplete是否完整;实际上找到了一个元素。如果搜索失败,它将返回grammar.end,而您的其余部分可能会崩溃

如何查找随机元素存在一个问题:

列表::迭代器lIt=listItem.begin

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

++点燃

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

高级照明,兰特%listItem.size


这可能会使迭代器前进太远。如果列表的大小为n,则最多可以前进n-2步,否则就超出了终点。但是rand%n可以是n-1。

首先,您的列表是如何加载的,以及如何分配给包含它的映射的,即索引源映射的键来自哪个源?程序读取格式化的外部文件。有几个括号{,}我们读取并存储在列表中。每个括号可以有几行。每个括号都给出了一个定义,其中第一行有一个单词封装在类似HTML的小于和大于符号中。我们将定义存储为键,然后将每一行分解为一个列表,所有列表都存储到更大的列表中并与键配对。该列表是教授的建议,因为我们可能处理一个非常大的文件。我开始认为使用向量的向量可能更容易。不过不太确定。好的,我将添加一个if-语句来检查它是否存在。我还将注释掉++lIt@user1993468在使用listItem之前,您还应该检查它是否为空。我正在梳理并检查我是否正在将数据存储到listItem中。我将添加另一个if-station。谢谢