2013-03-05 69 views
17

是否可以使用類似generate_n的東西來創建一個const vector的隨機數字?我想不出一種方法來做到這一點,而無需派生vector並在構造函數中進行賦值。如何初始化使用C++ 11的函數結果的常量向量?

+2

我知道你有這個答案了,但只是FYI''推導VECTOR'(或其他類型std'命名空間不是專門用於派生的)[風險](http://stackoverflow.com/questions/2034916/is-it-okay-to-inherit-implementation-from-stl-containers-rather-than-delegate ) – boycy 2013-03-06 13:41:55

回答

26

如果您願意,可以使用靜態助手或lambda表達式;如評論中指出的那樣移動語義/複製elision將使得這個相當便宜,因爲所有體面的編譯器都將省略助手返回的矢量的完整副本。相反,他們只會創建代碼來填充單個矢量,然後使用該矢量。

std::vector<int> Helper() 
{ 
    const size_t n = 10; 
    std::vector<int> x(n); 
    std::generate_n(x.begin(), n, someGenerator); 
    return x; 
} 

const std::vector<int> my_const_vec(Helper()); 

這裏是拉姆達版本:

const std::vector<int> my_const_vec([]() 
    { 
    const size_t n = 10; 
    std::vector<int> x(n); 
    std::generate_n(x.begin(), n, someGenerator); 
    return x; 
    }()); 
+1

有了這樣一個簡單的幫手,大多數編譯器甚至會完全複製副本。 – Agentlien 2013-03-05 10:44:36

+2

順便說一下,根據* current *標準,您的lambda需要一個' - > std :: vector ',我想。 – 2013-03-06 16:38:50

+0

嗯現在我很困惑。嘗試gcc4.7和cl17.00,他們都接受它,但我似乎記得以前的版本都會拒絕它。 – stijn 2013-03-06 17:03:31

0

封裝你初始化成一個函數,聲明它「constexpr」,讓你可以用它來初始化一個常量表達式。

+3

這裏不需要'constexpr',因爲他不需要一個編譯時常量表達式(無論如何,它都不能使用'std :: vector'返回)。 – 2013-03-06 16:40:30

0

您可以使用std::transform以及

vector<int> vec(10,1); 
transform(vec.begin(), vec.end(), vec.begin(), func); 

其中FUNC是:

int func(int i) 
{ 
//return a random generated number 
} 
+0

這是可能的,但OP要求一個* const *向量。 – stijn 2013-08-10 19:38:27

+0

@stijn哦,是的。但是我可能會使用一個臨時中間向量,然後將其分配給'const'向量,因爲即使您的方法在被調用的函數中創建了一個向量。 – Saksham 2013-08-11 02:23:22