中断然后继续for循环

时间:2014-03-28 08:48:02

标签: c++ for-loop iterator break continue

我已经构建了一个迭代的函数,直到它找到一个大于赋值给函数的值然后中断的值。

std::vector<AggregatedQuoteType>::iterator OrderBook::find_price(PriceType price)
{
   std::vector<AggregatedQuoteType>::iterator i = v_BuyOrders.begin();
    for (; i != v_BuyOrders.end(); ++i)
        if(i->get_price() >= price)        
            break;
   return i;        
}

然后我希望它能够测试另一个函数,如果没有,那么继续执行for循环。这可能吗?

3 个答案:

答案 0 :(得分:1)

如果你认为你的'另一个功能'在成功的情况下返回真实,那么如何:

std::vector<AggregatedQuoteType>::iterator OrderBook::find_price(PriceType price)
{
    std::vector<AggregatedQuoteType>::iterator i = v_BuyOrders.begin();
    for (; i != v_BuyOrders.end(); ++i)
    {
        if(i->get_price() >= price && another_function(i))
            return i;
    }
    return v_BuyOrders.end();
}

由于我不在for循环中,你也可以这样做:

std::vector<AggregatedQuoteType>::iterator OrderBook::find_price(PriceType price)
{
    std::vector<AggregatedQuoteType>::iterator i = v_BuyOrders.begin();
    for (; i != v_BuyOrders.end(); ++i)
    {
        if(i->get_price() >= price && another_function(i))
            break;
    }
    return i;
}

答案 1 :(得分:1)

只有在成功的情况下才执行if和break中的第二次检查。哦,不要忘记括号,它们使代码可读! :)

std::vector<AggregatedQuoteType>::iterator OrderBook::find_price(PriceType price)
{
    std::vector<AggregatedQuoteType>::iterator i = v_BuyOrders.begin();
    for (; i != v_BuyOrders.end(); ++i){
        if(i->get_price() >= price && second_check(i->get_price())){
                break;
            }
        }
    }
    return i;       
}

这样,它会执行您的搜索,对元素进行两次检查,并相应地中断。如果第二次检查没有成功,它就不会从循环中的位置继续中断。

答案 2 :(得分:0)

将逻辑设想转换为代码的最直接方式是:

std::vector<AggregatedQuoteType>::iterator OrderBook::find_price(PriceType price)
{
    std::vector<AggregatedQuoteType>::iterator i = v_BuyOrders.begin();
    do
    {
        for (; i != v_BuyOrders.end(); ++i)
            if(i->get_price() >= price)        
                break;
        return i; // i.e. end()
    } while (!another_function(*i));
    return i;
}

它简化为:

std::vector<AggregatedQuoteType>::iterator OrderBook::find_price(PriceType price)
{
    std::vector<AggregatedQuoteType>::iterator i;
    for (i = v_BuyOrders.begin(); i != v_BuyOrders.end(); ++i)
        if(i->get_price() >= price && another_function(*i))
            break;
    return i;
}

或者,如果您想使用标准算法进行更具声明性的方法:

#include <algorithm>
...

std::vector<AggregatedQuoteType>::iterator OrderBook::find_price(PriceType price)
{
    return std::find_if(v_BuyOrders.begin(), v_BuyOrders.end(), 
                        [](const AggregatedQuoteType& x)
                        { return x.get_price() >= price && another_function(x); });
}