我最近開始使用新的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表達式的正確方法是什麼?
不是一個答案到你的問題,但在C++ 11中,你可以使用[std :: iota](http://en.cppreference.com/w/cpp/algorithm/iota)。你的代碼對我來說很好(mingw32 4.6.1)。 – jrok 2011-12-28 19:40:14
我已經離開了C++循環了一段時間,所以猜測:它可能是'const n'不匹配'generate_n'的函數簽名嗎?這讓我想到了一個關於代碼的問題:爲什麼要對'unsigned int'使用'const'引用,而不僅僅是對'unsigned int'?這是一個簡單的類型,所以副本不應該超過通過引用傳遞的成本,而且它也是安全的。 – JoeFish 2011-12-28 19:41:13
請注意,通過引用來傳遞有效地返回新值在C++ 11中不是慣用的 - 移動語義將使得通過值有效返回。 – ildjarn 2011-12-28 20:09:53