2014-03-28 90 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的元素不是嗎? –