Перерыв, а затем продолжить петли

Я построил функцию, которая выполняет итерацию до тех пор, пока не найдет значение, превышающее значение, данное функции, а затем прервет работу.

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 ответа

Просто выполните вторую проверку внутри if и прервитесь, только если это также удастся. О, и не забывайте скобки, они делают код читабельным!:)

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

Таким образом, он выполнит ваш поиск, выполнит обе проверки вашего элемента и, соответственно, сломается. Если вторая проверка не удалась, она не прервется и продолжится с того места, где она была в цикле.

Если вы считаете, что ваша "другая функция" возвращает true в случае успеха, как насчет чего-то вроде:

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

Самый буквальный способ перевести ваши замыслы логики в код:

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); });
}
Другие вопросы по тегам