【问题标题】:Getting a string from a map of a list of a list of strings从字符串列表的映射中获取字符串
【发布时间】:2013-02-07 19:04:44
【问题描述】:

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

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

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

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

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

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

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

代码sn-p:

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

【问题讨论】:

  • 副手,您的列表如何加载以及如何分配给包含它的地图(即索引地图来源的键来自哪个来源)?跨度>
  • 程序读取格式化的外部文件。有几个括号(“{,}”)我们读取并存储到列表中。每个括号可以有几行。每个括号都有一个“定义”,其中第一行有一个包含在小于号和大于号中的单词(如 HTML)。我们将定义存储为键,然后将每一行分解为一个列表,并将所有列表存储到更大的列表中并与键配对。
  • 列表> 是教授的建议,因为我们可能会处理一个非常大的文件。我开始认为使用向量向量可能更容易。不过不太确定。

标签: c++ string list map


【解决方案1】:

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

  1. 你不检查grammar.find(incomplete); 是否真的找到了一个元素。如果搜索失败,它会返回grammar.end(),然后你的其他部分就会崩溃。

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

list&lt;list&lt;string&gt; &gt;::iterator lIt = listItem.begin();

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

++lIt;

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

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

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

【讨论】:

  • 好的,我将添加一个 if- 语句来检查它是否存在。我还将注释掉 ++lIt;
  • @user1993468 在使用之前,您还应该检查listItem 是否为空。
  • 我正在梳理并检查我是否将数据存储到 listItem 中。我将添加另一个 if- 语句。谢谢!
猜你喜欢
  • 2021-08-15
  • 2012-01-12
  • 1970-01-01
  • 2018-11-28
  • 2022-11-26
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多