2014-03-28 83 views
0

我已经构建了一个函数,迭代通过,直到它找到一个值大于给函数的值,然后中断。打破,然后继续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)   
      break; 
    return i;   
} 

然后,我会喜欢它来测试另一个函数,如果没有,那么继续for循环被破坏的地方。那可能吗?

+0

那么,它可能是*另一个循环没有初始化部分,因为你会使用我您保存的计算器。 – jsantander

+0

为什么不'if(i-> get_price()> = price && some_other_condition(i))break;'? –

+0

你能提出一个建议吗? –

回答

1

如果你认为你的“另一功能”在成功的情况下返回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; 
} 
+0

非常感谢!我会尝试现在:) –

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

这样,它会执行您的搜索,对您的元素执行两个检查,并相应地中断。如果第二次检查不成功,则不会中断它在循环中的位置。

+0

非常感谢你! –

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); }); 
} 
+0

你的简化不会编译,因为在'return i;'中,'i'已经超出范围。 – Chnossos

+0

@Chnossos:修正了几分钟前,但是谢谢.... –

+0

太棒了......这只会搜索v_BuyOrders的元素不是吗? –