2011-12-28 47 views
3

我最近開始使用新的C++ 11功能,如lambda表達式,以使我的代碼更易於閱讀。generate_n在C++中使用lambda和back_inserter

在這個例子中,我想要生成一個隨機排序的數字[0到n]的向量。我有類似於以下

#include <vector> 
    #include <algorithm> 
    #include <iterator> 
    using namespace std; 
    void _generateRandomIndices(vector<unsigned int> & indices, 
       const unsigned int & n) { 
     indices.clear(); 
     unsigned int i = 0; 
     generate_n(back_inserter(indices), n , [&i]()-> unsigned int{ 
                   return i++; 
                    }); 
     random_shuffle(indices.begin(), indices.end()); 
    } 

然而一些代碼,在Windows上使用克++ 4.6(與-std =的C++ 0x標誌)把我以下錯誤:

no matching function for call to 'generate_n(std::back_insert_iterator<std::vector<unsigned int> >, const unsigned int&, _generateRandomIndices(std::vector<unsigned int>&, const unsigned int&)::<lambda()>)' 

什麼是在這種情況下使用lambda表達式的正確方法是什麼?

+3

不是一個答案到你的問題,但在C++ 11中,你可以使用[std :: iota](http://en.cppreference.com/w/cpp/algorithm/iota)。你的代碼對我來說很好(mingw32 4.6.1)。 – jrok 2011-12-28 19:40:14

+1

我已經離開了C++循環了一段時間,所以猜測:它可能是'const n'不匹配'generate_n'的函數簽名嗎?這讓我想到了一個關於代碼的問題:爲什麼要對'unsigned int'使用'const'引用,而不僅僅是對'unsigned int'?這是一個簡單的類型,所以副本不應該超過通過引用傳遞的成本,而且它也是安全的。 – JoeFish 2011-12-28 19:41:13

+0

請注意,通過引用來傳遞有效地返回新值在C++ 11中不是慣用的 - 移動語義將使得通過值有效返回。 – ildjarn 2011-12-28 20:09:53

回答

2

聽起來像是你缺少一個#include <algorithm>,因爲GCC 4.5.1藏漢作爲MSVC10編譯下面的代碼沒有錯誤:

#include <vector> 
#include <algorithm> 
#include <iterator> 
using namespace std; 

void _generateRandomIndices(vector<unsigned int> & indices, 
     const unsigned int & n) { 
    indices.clear(); 
    unsigned int i = 0; 
    generate_n(back_inserter(indices), n , [&i]()-> unsigned int{ 
                  return i++; 
                   }); 
    random_shuffle(indices.begin(), indices.end()); 
} 

int main(){ 
} 
+0

其實我包括了所有這些標題,我只需要輸入代碼 – sohaibafifi 2011-12-28 19:32:44

+0

@sohaibafifi:如果確實包含了所有內容,那麼你的stdlib可能會被破壞。要麼你有一個包含C++ 03 stdlib的路徑,要麼是其他的錯誤。你使用哪個GCC端口的Windows? – Xeo 2011-12-28 19:40:00

+0

mingw32 one – sohaibafifi 2011-12-28 19:41:26

0

您應該添加此compiller選項-std =的C++ 0x

+3

沒有這個編譯器選項,GCC會窒息lambda,而不是'generate_n'算法。 – Xeo 2011-12-28 19:30:15

+0

我這樣做,儘管它在g ++ 4.6中默認啓用。 – sohaibafifi 2011-12-28 19:33:33

+0

http://gcc.gnu.org/gcc-4.6/cxx0x_status.html GCC爲即將到來的ISO C++標準C++ 0x提供實驗支持。可以使用-std = C++ 0x或-std = gnu ++ 0x編譯器選項啓用此支持。在我的Gcc 4.5上,這個代碼用這個選項編譯 – Andrew 2011-12-28 19:39:03