2010-02-12 38 views
0

我想用Boost Lambda中的變換和if_then_else控制結構來更改矢量中的整型值。然而,我的編譯器不讚賞我的努力。我試圖代碼是:用if_then_else控制結構進行C++轉換

transform(theVec.begin(), theVec.end(), theVec.begin(), 
      if_then_else(bind(rand) % ratio == 0, _1 = bind(rand) % maxSize, _1)); 

我想它簡化爲以下:

transform(theVec.begin(), theVec.end(), theVec.begin(), 
      if_then_else(0 == 0, _1 = MaxIntSizeCFG, _1)); 

但是編譯器告訴我:呼叫沒有匹配功能「if_then_else(...... ....」 我讀了從控制結構的返回值是無效的,所以在這種情況下完全錯誤的我試圖使用?提前

感謝您的時間!

回答

1

if_then_else在您的使用不正確,以同樣的方式是這樣的:

int i = if (some_condition){ 0; } else { 1; }; 

你想要的僅僅是三元運算符;然而,這在lambda中不起作用。您可以使用if_then_else_return結構來模擬此操作。 (即,您已經接近!)

if_then_else適用於類似for_each循環的情況,您可以根據條件採取一個動作或另一個動作。 if_then_else_return用於三元條件。

+0

啊,是的,當然沒有什麼東西被傳回if_the_else結構。我嘗試過: transform(theVec.begin(),theVec.end(),theVec.begin(),if_then_else_return(bind(rand)%ratio == 0,_1 = bind(rand)%maxSize,_1)) ; 和這工作得很好。謝謝! – Demps 2010-02-12 05:00:14

+0

沒問題,我會等待你的下一個lambda問題。 :P – GManNickG 2010-02-12 05:01:26

+0

哈哈,它排隊!其實你能推薦一個很好的資源來表達lambada表達嗎?我只是剛剛開始使用它們(正如你所看到的那樣),我對可以做的事情印象深刻。 – Demps 2010-02-19 02:57:39

1

既然你已經使用升壓,我建議BOOST_FOREACH,而不是這樣一個複雜的lambda表達式:

BOOST_FOREACH(int & i, v) 
    i = rand() % ratio ? i : rand(); 

這將是很容易,一旦適應新的範圍爲基礎的循環變爲可用:

for(int & i : v) 
    i = rand() % ratio ? i : rand(); 
+0

是否已有編譯器允許實驗性用法的第二種語法? – 2010-02-13 00:56:29

+0

@rjones - 概念GCC自2007年起支持它(!)http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2196.html。由於從即將到來的標準中刪除了一些概念,主要的編譯器需要更長的時間 – Manuel 2010-02-13 08:53:20