为什么递归函数中的迭代器在返回后指向起点?

问题描述

我有一个类似数据结构的图形,其中(用户定义的gnode类的)每个节点都有一个映射,该映射具有从该节点的过渡作为键,到各个节点的指针作为值。我需要找到此数据结构中的所有叶节点。

我写了一个递归函数:

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的位置开始的过渡,而是指向地图过渡的开始并再次进行遍历。我有一个访问数组,可以确保不再进行对n3的调用,但是我想知道为什么它从头开始遍历n2中的过渡,以及如何让它简单地从调用点继续进行检查。

之所以认为这是问题所在,是因为我在每次调用中为每次迭代打印了map_itr值,并且在n3之后,它从n2中的第一个转换开始,而不是继续。如果有帮助,返回n2后,如果我尝试访问map_itr所指向的元素,则会出现细分错误。

解决方法

这不是答案,而是我暂时使用的解决方法。

我创建了一个映射迭代器作为gnode类的成员,以便每个节点都有一个与之关联的迭代器。当我使用此迭代器而不是leaves函数中定义的迭代器时,一切运行顺利。

我认为对于每个递归调用,不会在调用开始时创建一个新的迭代器,而是将覆盖以前的迭代器的值。我认为可以通过iterator map_itr = new iterator();之类的方法解决此问题,但我认为您无法在c ++中做到这一点。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...