c++ - 如何遍历嵌套 vector ?

标签 c++ list vector tuples c++-standard-library

我对我的作品有一个相当复杂的有序内部语法表示,它由类型化的std libarary类组成:

class Grammar {
    std::tuple<int, NonTerminal, std::vector<std::vector<Symbol>>> productions;
}
现在,我想根据此表示创建LR0-Items。
从内到外:
  • std::vector<Symbol>表示规则
  • std::vector<std::vector<Symbol>>表示生产的替代规则。
  • NonTerminal, std::vector<std::vector<Symbol>>>表示生产
  • 的lhs
  • std::tuple<int, NonTerminal, std::vector<std::vector<Symbol>>>表示作品的顺序。

  • 问题:如何遍历作品?我是C++的新手。据我所知,方法是通过::iterator。但是,然后如何处理一个嵌套数据类型以从中构建迭代器?
    谢谢
    编辑:
    我认为最好是让定义由两次std::tuple组成,而不是std::pair:
    std::pair<int, std::pair<NonTerminal, std::vector<std::vector<Symbol>>> productions;
    
    我尝试采用idclev 463035818用户的答案
    for( const &auto production : productions.back) {
      for( const &auto alternatives : production.back) {
        for( const &auto rule : alternatives) {
         // ...
        }
      }
    }
    
    对吗

    最佳答案

    要迭代其元素类型为T的 vector ,可以使用基于范围的for循环:

    std::vector<T> vect;
    for (const auto& element : vect) {
        // element is a const reference to elements of vect
        // put code here
    }
    
    现在,如果T再次是一个 vector ,则只需将//put code here替换为您的代码即可迭代该 vector element

    嵌套容器并不像您预期​​的那样复杂。它不需要特殊处理。如果您知道如何迭代一个 vector 并获得对其元素的引用,那么您已经知道如何迭代那些元素(如果它们是 vector )。

    假设您有一个std::vector<std::vector<Symbol>>>(我跳过了元组,因为我想您不想“迭代”它,而只是从中选择第三个元素)。
    std::vector<std::vector<Symbol>>> vect_vect;
    
    for (const auto& vect : vect_vect) {
        // here vect is a const reference to std::vector<Symbol>
        for (const auto& symbol : vect) {
           // here symbol is a const reference to a Symbol
           // put your code here
           // eg assuming Symbol has a member get_bar
           auto foo = symbol.get_bar();
        }
    }
    

    关于c++ - 如何遍历嵌套 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64857449/

    相关文章:

    c++:static_cast<int> std::sqrt(x) 是否总是为平方的正整数给出准确的结果?

    python - 解析具有间隔的整数集字符串以列出

    python - 计算嵌套列表中每个位置的出现次数

    r - 如何从另外两个向量创建一个向量,使用一个作为标签,另一个作为值?

    c++ - 调用对象 vector 的成员函数

    c++ - 动态创建新对象的最佳方法

    c++ - 基于 Boost.ASIO 的 HTTP 客户端库(如 libcurl)

    c++ - ‘=’ , ‘,’ , ‘;’ , ‘asm’ 或 ‘__attribute__’ 在 ‘{’ token 之前,当我使用::va_list时;

    c++ - OpenGL 顶点着色器变换,对象消失

    C# 在单词之间使用 BAR 格式化列表项