在对象列表上使用迭代器时出现问题

Trouble using iterator on a list of objects

本文关键字:问题 迭代器 对象 列表      更新时间:2023-10-16

所以我有一个名为 symbol 的类,它由 4 个字符串组成,这些字符串都是公共的。 我创建了一个这些列表,我想在这个列表中做一个展望。 这就是我目前所拥有的。 我查找了迭代器方法,它说它支持 + 运算符,但我得到了一个错误。

    bool parser::parse(list<symbol> myList){
    //Will read tokens by type to make sure that they pass the parse
    std::list<symbol>::const_iterator lookAhead = myList.begin();
    if ((lookAhead + 1) != myList.end)
        lookAhead++;
    for (std::list<symbol>::const_iterator it = myList.begin(); it != myList.end(); ++it){
        if (it->type == "") {
        }
    }
    return true;
}

尝试添加 1 以提前查看时出现错误。 有哪些好方法可以创建列表的前瞻性视图?

谢谢宾克斯

链表不支持随机访问迭代器,即您不能向其迭代器添加整数。

使用 std::next(lookAhead) 获取下一个迭代器,或std::advance(lookAhead, 1) 。这些函数知道正在传递哪种迭代器,并且如果可能的话,将使用随机查找(例如,使用std::vector的随机访问迭代器),或者手动前进(在std::advance()的情况下使用循环),否则,就像在这种情况下一样。

不过,要小心无条件地推进迭代器——前进超过end()是不确定的!

您可以在此处阅读有关不同类别的C++迭代器的更多信息。

旁注:传入时,您将复制整个列表,因为您是按值传递的。您可能希望通过引用传递它(list<symbol> const& myList)。您还可以使用 C++11 auto 关键字简化代码,该关键字从初始化变量的表达式的类型自动推断类型:

bool parser::parse(list<symbol> const& myList){
    // Will read tokens by type to make sure that they pass the parse
    auto lookAhead = myList.begin();
    if (lookAhead != myList.end() && std::next(lookAhead) != myList.end())
        ++lookAhead;
    for (auto it = myList.begin(); it != myList.end(); ++it){
        if (it->type == "") {
        }
    }
    return true;
}