我对我的作品有一个相当复杂的有序内部语法表示,它由类型化的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>>>
表示生产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/