C++ 中断,然后继续for循环
我构建了一个函数,它会迭代,直到找到一个大于函数给定值的值,然后中断C++ 中断,然后继续for循环,c++,for-loop,iterator,break,continue,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)
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;
}
std::vector::iterator OrderBook::find_price(价格类型价格)
{
std::vector::iterator i=v_BuyOrders.begin();
对于(;i!=v_BuyOrders.end();++i)
如果(i->get_price()>=价格)
打破
返回i;
}
然后,我希望它针对另一个函数进行测试,如果这不成立,那么在for循环中断的地方继续。这是可能的吗? < P>如果你认为你的“另一个功能”在成功的情况下返回真实,那么,比如:
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();
}
std::vector::iterator OrderBook::find_price(价格类型价格)
{
std::vector::iterator i=v_BuyOrders.begin();
对于(;i!=v_BuyOrders.end();++i)
{
如果(i->get_price()>=price&另一个_函数(i))
返回i;
}
返回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::iterator OrderBook::find_price(价格类型价格)
{
std::vector::iterator i=v_BuyOrders.begin();
对于(;i!=v_BuyOrders.end();++i)
{
如果(i->get_price()>=price&另一个_函数(i))
打破
}
返回i;
}
只需在if和break中执行第二次检查,并且只有在成功时才执行。哦,别忘了括号,它们使代码可读!)
std::vector::iterator OrderBook::find_price(价格类型价格)
{
std::vector::iterator i=v_BuyOrders.begin();
对于(;i!=v_BuyOrders.end();++i){
如果(i->get_price()>=价格和第二次检查(i->get_price())){
打破
}
}
}
返回i;
}
这样,它将执行您的搜索,对您的元素执行两项检查,并相应地中断。如果第二次检查没有成功,它将不会从循环中的位置中断continue。将您对逻辑的设想转换为代码的最直接的方式是:
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::iterator OrderBook::find_price(价格类型价格)
{
std::vector::iterator i=v_BuyOrders.begin();
做
{
对于(;i!=v_BuyOrders.end();++i)
如果(i->get_price()>=价格)
打破
返回i;//即end()
}而(!另一个_函数(*i));
返回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;
}
std::vector::iterator OrderBook::find_price(价格类型价格)
{
std::vector::迭代器i;
对于(i=v_BuyOrders.begin();i!=v_BuyOrders.end();++i)
如果(i->get_price()>=price&另一个_函数(*i))
打破
返回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); });
}
#包括
...
标准::向量::迭代器订单簿::查找价格(价格类型价格)
{
return std::find_if(v_BuyOrders.begin(),v_BuyOrders.end(),
[](const AggregatedQuoteType&x)
{return x.get_price()>=price&另一个_函数(x);});
}
嗯,这可能是另一个没有初始值设定项部分的循环,因为您将使用保存的迭代器。如果(i->get\u price()>=price&&some\u other\u condition(i))中断,为什么不代码>?你能提个建议吗?你能试着用catch logic帮你解决这个问题吗?ie抛出错误并丢弃以捕获块,然后继续?@krowe您不认为在简单的条件检查可以执行时使用try/catch逻辑,并且当它与“异常”或“错误”无关时有点混乱吗?您的简化不会编译,因为在中返回i
,i
已经超出范围。太好了……这将只搜索v_BuyOrders的元素,不是吗?@RuthO'Brien是的-每个版本在指定的迭代器之间搜索-即v_BuyOrders.begin()
和v_BuyOrders.end()
std::find_if
也从返回第一个匹配项的begin()
开始递增,或者如果没有匹配项,则从.end()
开始递增。
#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); });
}