提问者:小点点

检查给定的关系是否可传递,如果不是,则添加新的对使其可传递


我试着检查给定的关系是否是可传递的,如果不是,添加新的关系对使它是可传递的。输入示例:

aa ab ad be

函数应该使其成为:,因为为了传递,如果存在,则也必须存在。但无论我怎么做都有分割错误。

我是C++编程的新手,正在学习迭代器。下面是我的功能:

vector<string> isTransitive(vector<string> relations){
    bool flag;
    for(auto it=relations.begin();it != relations.end(); ++it){ 
        for(auto it2=relations.begin();it2 != relations.end(); ++it2){
            if((*it)[1] == (*it2)[0] && (*it)[0] != (*it)[1] && (*it2)[0]!=(*it2)[1]){ //if there exists ab and bc
                string newRelation;  //if there is a (a,b) (b,c) holds (a,c)
                newRelation.push_back((*it)[0]);
                newRelation.push_back((*it2)[1]);
                flag=false;
                for(auto it3=relations.begin();it3 != relations.end(); ++it3){
                    if(*it3==newRelation){
                        flag=true;
                        it3=relations.end(); //break the loop
                        it2=relations.end(); //break the loop
                    }
                }
                if(flag==false){
                    relations.push_back(newRelation);
                }
            }
        }
    }
    return relations;
}

当此语句为时,我得到segFault。


共1个答案

匿名用户

for循环等效于while循环(来自cppreference:

{

    init_statement
    while ( condition ) {

        statement
        iteration_expression ;

    } 

} 

用这两行:

it3=relations.end(); //break the loop
it2=relations.end(); //break the loop

您没有破坏循环,但您导致了未定义的行为。两个迭代器将首先递增,然后检查循环条件。此时不再是。或多或少是这样的:

{
    auto it = relations.begin();
    while (it != relations.end()) {
        it = relations.end();
        ++it;
    }
}

条件永远不会是,并且您的运行超过了的结尾。

要打破循环,请使用。要打破嵌套循环,可以将它们放在一个函数中,并使用