我有一个光标,其“位置”由代码的另一部分决定。我的目的是让光标检查向量的下一个和上一个对象并检查条件。如果它有效,则光标将获取此对象的位置。 这是我的想法的一些示例代码:
class A
{
bool valid;
public:
A(bool v) {valid=b;}
bool IsValid() {return valid;}
};
void CheckNearbyValidity()
{
/*if the object to the right is valid, update position to this object*/
if(exampleVector.at(cursor-1).IsValid())
{
/*do stuff*/
cursor = (cursor-1);
}
/*if the object to the right isnt valid, try the same thing to the left*/
else if(exampleVector.at(position+1).IsValid())
{
/*do stuff*/
cursor = (cursor+1);
}
/*leave if none are valid*/
}
我遇到的问题是,如果光标位于向量的开头或结尾,检查if条件是否会导致它超出范围异常。
我的解决方案是在查询向量之前检查新光标位置是否有效:
void CheckNearbyValidity()
{
/*if the object to the right is valid, update position to this object*/
if(cursor-1 >= 0)
{
if(exampleVector.at(cursor).IsValid())
{
/*do stuff*/
cursor = (cursor-1);
}
}
/*new position makes the next condition always true and returns cursor to the same position*/
if(cursor-1 < exampleVector.size())
{
if(exampleVector.at(cursor+1).IsValid())
{
/*do stuff*/
cursor = (cursor+1);
}
}
/*leave if none are valid*/
}
新问题是因为我不能使用“else”,所以这两个条件都是有效的,并且光标将保持在它开始的位置。
我解决这个问题的方法是在while循环中包含该函数,并在必要时中断:
void CheckNearbyValidity()
{
while(true)
{
if(cursor-1 >= 0)
{
if(exampleVector.at(cursor-1).IsValid())
{
/*do stuff*/
position = (cursor-1);
break;
}
}
if(cursor-1 >= 0)
{
if(exampleVector.at(cursor+1).IsValid())
{
/*do stuff*/
position = (cursor+1);
break;
}
}
break;
}
}
我的问题是,是“单一”循环接近一个坏主意?有没有更好的方法来操纵这个光标?
答案 0 :(得分:1)
你应该利用&&
:
if (cursor-1 >= 0 &&
exampleVector.at(cursor-1).IsValid())
{
/*do stuff*/
position = (cursor-1);
}
else if (cursor+1 < exampleVector.size() &&
exampleVector.at(cursor+1).IsValid())
{
/*do stuff*/
position = (cursor+1);
}
这允许您将两个语句作为if-else
原样连接在一起,只需使用额外的验证步骤检查cursor
对矢量边界。
&&
执行短路评估。如果cursor-1 >= 0
评估为false
,则代码会跳过评估exampleVector.at(cursor-1).IsValid()
并立即跳转到评估else
子句。
同样,在else if
子句中,如果cursor+1 < exampleVector.size()
评估为false
,则&&
短路和代码会跳过评估exampleVector.at(cursor+1).IsValid()
,再次制作这很安全。