簡體   English   中英

如何使用迭代器在C ++的遞歸函數中傳遞值?

[英]How can I use iterator to pass the value in a recursive function in c++?

如果我按以下方式運行代碼,則輸入崩潰。 但是,如果我不使用迭代器,而是使用注釋部分(在DFS()函數中)編寫的代碼,則它可以很好地運行並且不會崩潰。 我不明白為什么這段代碼會因迭代器而崩潰。

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>

using namespace std;

vector<pair<int, int> > graph[30009];
vector<pair<int, int> >:: iterator it;

long long int far;
int  visit[30001], last;

void DFS(int vertex, long long int edge)
{
    if(edge > far){
        far = edge;
        last = vertex;
    }
    /*for(int i = 0; i < graph[vertex].size(); i++){
        int node = graph[vertex][i].first;
        int weight = graph[vertex][i].second;
        if(visit[node] == 0){
        visit[node] = 1;
        DFS(node, edge+weight);
    }
}*/
    for(it = graph[vertex].begin(); it != graph[vertex].end(); it++){
        int node = it->first;
        int weight = it->second;
        if(visit[node] == 0){
            visit[node] = 1;
            DFS(node, edge+weight);
        }
    }

return;

}
int main()
{
    int T, n,u,v,w;
    scanf("%d", &T);
    for(int i = 1; i <= T; i++){
            far = 0;

        memset(visit, 0, sizeof(visit));
        scanf("%d", &n);
        for(int j = 0; j < 30001; j++)
            graph[j].clear();
        for(int j = 1; j < n; j++){
            scanf("%d%d%d", &u, &v, &w);
            graph[u].push_back(make_pair(v,w));
            graph[v].push_back(make_pair(u,w));
        }
        visit[0] = 1;
        DFS(0, 0);

        memset(visit, 0, sizeof(visit));
        visit[last] = 1;
        DFS(last, 0);

        printf("Case %d: %lld\n", i, far);
    }
    return 0;
}

問題

it是全球性的,所以每次調用DFS使用相同的it 所以當你

for(it = graph[vertex].begin(); it != graph[vertex].end(); it++){

it “指向”另一個vector進行迭代。 DFS返回時,調用DFS嘗試使用錯誤的vector繼續進行中斷,並且該vector已經被迭代到end() it超出范圍,一旦發生這種情況,任何使用都是Undefined Behavior 此外it != graph[vertex].end()僅在偶然的情況下才是正確的,因為它們都引用了不同的vector s,因此該循環進一步漫游到未知領域,最終該錯誤被發現,對無論如何,都在崩潰中。

去掉

vector<pair<int, int> >:: iterator it;

並更換

for(it = graph[vertex].begin(); it != graph[vertex].end(); it++)

for(auto it = graph[vertex].begin(); it != graph[vertex].end(); it++)

要么

for(vector<pair<int, int> >::iterator it = graph[vertex].begin(); 
    it != graph[vertex].end(); 
    it++)

取決於目標C ++標准。

警告

這只能解決最明顯的問題。 可能還有其他。 我還沒有檢查。

暫無
暫無

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

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