Перерыв, а затем продолжить петли
Я построил функцию, которая выполняет итерацию до тех пор, пока не найдет значение, превышающее значение, данное функции, а затем прервет работу.
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); });
}