如何在c ++中访问列表中的元素

时间:2011-02-01 15:35:22

标签: c++

我正在解决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(),但这并不起作用。

任何帮助都将不胜感激。

6 个答案:

答案 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()));