检查其边界时,通过向量运行游标

时间:2013-11-20 00:56:01

标签: c++ vector cursor

我有一个光标,其“位置”由代码的另一部分决定。我的目的是让光标检查向量的下一个和上一个对象并检查条件。如果它有效,则光标将获取此对象的位置。 这是我的想法的一些示例代码:

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

我的问题是,是“单一”循环接近一个坏主意?有没有更好的方法来操纵这个光标?

1 个答案:

答案 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(),再次制作这很安全。