簡體   English   中英

為什么遞歸 function 中的迭代器在返回后指向開頭?

[英]Why does an iterator in a recursive function point to the beginning after a return?

我有一個類似圖的數據結構,其中每個節點(用戶定義的 gnode 類)都有一個 map,從節點的轉換作為鍵,指向各個節點的指針作為值。 我需要在這個數據結構中找到所有的葉子節點。

我寫了一個遞歸的 function:

void leaves (gnode * node, int visited[],
             set<int, less <int> > * path, set<gnode*> * leaf_list) 
{
    int index = 0, elem; 
    bool check = false, transition_taken = false;

    for (this->map_itr = node->get_map()->begin();
         this->map_itr!= node->get_map()->end();
         this->map_itr++) 
    { 
        set <int, less<int> > transition = this->map_itr->first;
        elem = * transition.begin();
        index = std::distance(path->begin(), path->find(* transition.begin())); 
        
        if (transition.size() > 1) 
            check = std::includes (path->begin(), path->end(),
                        transition.begin(), transition.end())
                && !visited[index];
        else 
            check = path->find(elem) != path->end() 
                && !visited[index];
        if (check) {
            transition_taken = true;
            visited[index] = true;
            leaves (this->map_itr->second, visited, path, leaf_list);
    }
    if (!transition_taken) leaf_list->insert(node);
}

我遇到的問題是:

假設存在從 n1 → n2 → n3(葉)的轉換。 一旦遇到葉子 n3,就會返回到 n2。 現在 n2 中的 map_itr 不再繼續檢查從調用 n3 的位置開始的轉換,而是指向 map 轉換的開始並再次通過它。 我有一個訪問過的數組,可確保不再調用 n3,但我想知道為什么它從一開始就遍歷 n2 中的轉換,以及如何讓它簡單地從調用點繼續檢查。

我認為這是問題所在的原因是,我已經為每次調用中的每次迭代打印了map_itr值,並且在 n3 之后,它從 n2 中的第一個轉換開始,而不是繼續。 如果它有任何幫助,在返回 n2 之后,如果我嘗試訪問map_itr指向的元素,它會給我一個分段錯誤。

這不是答案,而是我暫時使用的解決方法。

我創建了一個 map 迭代器作為 gnode class 的成員,以便每個節點都有一個與之關聯的迭代器。 當我使用這個迭代器而不是葉子 function 中定義的迭代器時,一切運行順利。

我認為對於每個遞歸調用,在調用開始時都不會創建一個新的迭代器,而是會覆蓋前一個迭代器的值。 我認為這可以用iterator map_itr = new iterator();類的東西來解決。 但我認為你不能在 c++ 中做到這一點。

暫無
暫無

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

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