我正在解决Accelerated C ++中的问题 我们有一个程序,它在向量中存储字符串并根据某些规则输出它们。 原始代码片段如下。
typedef vector<string> Rule;
typedef vector<Rule> Rule_collection;
typedef map<string, Rule_collection> Grammar;
// read a grammar from a given input stream
Grammar read_grammar(istream& in)
{
Grammar ret;
string line;
// read the input
while (getline(in, line)) {
// `split' the input into words
vector<string> entry = split(line);
if (!entry.empty())
// use the category to store the associated rule
ret[entry[0]].push_back(
Rule(entry.begin() + 1, entry.end()));
}
return ret;
}
然后我们被要求使用列表而不是矢量。
所以上面的所有向量现在都将成为列表。
我坚持的一点是如何处理开始ret [entry]的行.push_back等。还有什么在Rule之后放入...... 我尝试过使用entry.begin(),但这并不起作用。
任何帮助都将不胜感激。
答案 0 :(得分:2)
使用列表,您可以使用向量执行大部分操作,但由于没有随机访问权限,因此无法使用entry[0]
。
entry.front()
将获得该元素。
此外,您无法向entry.begin()
添加1,因为它是双向的,不支持+,但您可以将其分配给临时迭代器,然后++it
。
答案 1 :(得分:1)
entry.begin ()
将迭代器返回到列表的开头,而
entry [0]
vector的返回第一个元素,所以我想你需要类似下面的内容
*(entry.begin ())
编辑:
希望我理解你的要求......除了开头和结尾应该返回矢量和列表的可比值
答案 2 :(得分:0)
begin()
为您提供了列表开头的迭代器。您可以取消引用迭代器,它会为您提供第一个值...
ret[*(entry.begin())].push_back(...
或者您可以使用front()
函数,该函数返回列表前面的元素(技术上是参考,但在这种情况下应该有效)。
ret[entry.front()].push_back(...
编辑:
正如其他人所指出的,正如你暗示的那样,entry
提供的std::list<string>
作品是{{1}}。
答案 3 :(得分:0)
ret[entry[0]]
调用Grammar::operator[]
将string
传递给entry[0]
:split
中包含的字符串,这是split
放入此类向量中的第一个字符串。< / p>
假设std::list
返回ret[ entry.front() ] ... // where entry is a std::list<string>
,您应该只获取列表的第一个元素:
{{1}}
答案 4 :(得分:0)
这段代码非常通用 - 它应该只在你更改typedef时工作,除了像std::list
之类的一些小问题不提供随机访问迭代器,并且因为你没有显示代码我可以谈论split
。
答案 5 :(得分:0)
您需要使用以下内容替换代码:
ret[*(entry.begin())].push_back(
Rule(++(entry.begin()), entry.end()));