问题描述
我正在尝试检查给定的关系是否是可传递的,如果不是,则添加新的关系对以使其具有可传递性。示例输入:
aa ab ad be
函数应该是这样的:
aa ab ad be ae
因为为了传递性,如果 ab
和 bc
存在,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
。