我试着检查给定的关系是否是可传递的,如果不是,添加新的关系对使它是可传递的。输入示例:
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;
}
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;
}
}
条件永远不会是
要打破循环,请使用