我已经构建了一个迭代的函数,直到它找到一个大于赋值给函数的值然后中断的值。
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循环。这可能吗?
答案 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); });
}