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

问题描述

我正在尝试检查给定的关系是否是可传递的,如果不是,则添加新的关系对以使其具有可传递性。示例输入:

aa ab ad be

函数应该是这样的: aa ab ad be ae 因为为了传递性,如果 abbc 存在,ac 也必须存在。但是无论我怎么尝试,我都会遇到分段错误。

我是 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;
}

if(*it3==newRelation) 当这个语句是 true 时,我得到了段错误。

解决方法

for 循环等价于 while 循环(来自 cppreference):

{

    init_statement
    while ( condition ) {

        statement
        iteration_expression ;

    } 

} 

用这两行:

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

您并没有打破循环,而是导致了未定义的行为。两个迭代器都将首先递增,然后检查循环条件。那时 it3 不再是 relations.end()。大致是这样的:

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

条件永远不会是 true 并且您会跑到 relations 的末尾。

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

相关问答

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