如何遍历嵌套向量?

How do I iterate through nested vectors?

提问人:von spotz 提问时间:11/16/2020 最后编辑:von spotz 更新时间:11/16/2020 访问量:525

问:

我有一个相当复杂的有序内部语法表示,由类型化的 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::tuplestd::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) {
     // ...
    }
  }
}

正确?

C++ 列表 向量 元组 c++-standard-library

评论

0赞 JulianW 11/16/2020
对于你尝试建立自己的语法表示的问题重要吗?
0赞 Jarod42 11/16/2020
您的 LR0 项目看起来如何?
0赞 Jarod42 11/16/2020
从中创建迭代器并不需要简单,但您可以简单地遍历嵌套的容器。
0赞 Sam Varshavchik 11/16/2020
你的C++教科书中是否有任何例子可以作为例子?
0赞 von spotz 11/16/2020
我的 c++ 教科书大约有 15 年的历史了,我必须搜索十几个纸板箱才能找到它们。:(解决嵌套容器(这种说法正确吗?)在C++中似乎不是一个微不足道的问题......至少对于像我这样的(重新)初学者

答:

1赞 463035818_is_not_an_ai 11/16/2020 #1

要迭代其元素为 type 的向量,您可以使用基于 for 循环的范围:T

std::vector<T> vect;
for (const auto& element : vect) {
    // element is a const reference to elements of vect
    // put code here
}

现在,如果又是一个向量,你只需用你的代码替换来迭代该向量。T//put code hereelement


嵌套容器并不像您想象的那么复杂。它不需要特殊处理。如果您知道如何迭代一个向量并获取对其元素的引用,那么您已经知道如何迭代这些元素,以防它们是向量。


所以假设你有一个(我将跳过元组,因为我想你不想“迭代”它,而只是从中选择第三个元素)。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();
    }
}

评论

0赞 von spotz 11/16/2020
谢谢。我可以用 .<whatever> 解决容器的其他元素吗?elements
0赞 463035818_is_not_an_ai 11/16/2020
@vonspotz if 是 a 并且有一个成员,则指该成员Tfoofoobarelement.bar
0赞 von spotz 11/16/2020
感谢您的回答,但问题是,正如您在上面看到的,容器是不同类型的,并且没有名称句柄!:(仅键入。
0赞 463035818_is_not_an_ai 11/16/2020
@vonspotz对不起,但你不明白我的回答。我想传达的信息是:元素的类型并不重要。迭代它们总是一样的。有了它,你就可以使用完全相同的代码,不管实际是什么。“没有名称句柄”是什么意思?我不明白。如果您编写的代码中有错误问题,则需要显示该代码。但请考虑到这个问题已经有了答案,所以你不应该改变问题来问别的东西,最好打开一个新的autoT
0赞 von spotz 11/16/2020
也许我应该尝试以某种方式通过继承对层次结构进行建模,并从中派生一些类或使它们成为成员?vector<T>