提问人:von spotz 提问时间:11/16/2020 最后编辑:von spotz 更新时间:11/16/2020 访问量:525
如何遍历嵌套向量?
How do I iterate through nested vectors?
问:
我有一个相当复杂的有序内部语法表示,由类型化的 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>>>
表示生产的 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) {
// ...
}
}
}
正确?
答:
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 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();
}
}
评论
0赞
von spotz
11/16/2020
谢谢。我可以用 .<whatever> 解决容器的其他元素吗?elements
0赞
463035818_is_not_an_ai
11/16/2020
@vonspotz if 是 a 并且有一个成员,则指该成员T
foo
foo
bar
element.bar
0赞
von spotz
11/16/2020
感谢您的回答,但问题是,正如您在上面看到的,容器是不同类型的,并且没有名称句柄!:(仅键入。
0赞
463035818_is_not_an_ai
11/16/2020
@vonspotz对不起,但你不明白我的回答。我想传达的信息是:元素的类型并不重要。迭代它们总是一样的。有了它,你就可以使用完全相同的代码,不管实际是什么。“没有名称句柄”是什么意思?我不明白。如果您编写的代码中有错误问题,则需要显示该代码。但请考虑到这个问题已经有了答案,所以你不应该改变问题来问别的东西,最好打开一个新的auto
T
0赞
von spotz
11/16/2020
也许我应该尝试以某种方式通过继承对层次结构进行建模,并从中派生一些类或使它们成为成员?vector<T>
评论