如何遍历嵌套向量?
How do I iterate through nested vectors?
我的产品有一个相当复杂的有序内部语法表示,由类型化的标准库组成 类:
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
的向量,您可以使用基于范围的 for 循环:
std::vector<T> vect;
for (const auto& element : vect) {
// element is a const reference to elements of vect
// put code here
}
现在,如果 T
又是一个向量,您只需将 //put code here
替换为您的代码即可迭代该向量 element
.
嵌套容器并不像您想象的那么复杂。它不需要特殊处理。如果您知道如何迭代一个向量并获取对其元素的引用,那么您已经知道如何迭代这些元素(如果它们是向量)。
假设您有一个 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();
}
}
我的产品有一个相当复杂的有序内部语法表示,由类型化的标准库组成 类:
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>>>
表示生产的lhsstd::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
的向量,您可以使用基于范围的 for 循环:
std::vector<T> vect;
for (const auto& element : vect) {
// element is a const reference to elements of vect
// put code here
}
现在,如果 T
又是一个向量,您只需将 //put code here
替换为您的代码即可迭代该向量 element
.
嵌套容器并不像您想象的那么复杂。它不需要特殊处理。如果您知道如何迭代一个向量并获取对其元素的引用,那么您已经知道如何迭代这些元素(如果它们是向量)。
假设您有一个 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();
}
}