簡體   English   中英

如何遍歷嵌套向量?

[英]How do I iterate through nested vectors?

我的作品有一個相當復雜的有序內部語法表示,由類型化的 std 庫類組成:

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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM