2013-03-05 13 views
17

generate_nのようなものを使用して、例えば乱数のconst vectorを作成できますか?私はvectorを導出せずにコンストラクタで代入を行うことなく、それを行う方法を考えることができませんでした。C++ 11を使用して関数結果のconstベクトルをどのように初期化しますか?

+2

が、ちょうどFYI 'で' vector'(または他のタイプの導出std'名前空間は特に誘導されることを意図していません)は危険です(http://stackoverflow.com/questions/2034916/is-it-okay-to-inherit-implementation-from-stl-containers-rather-than-delegate ) – boycy

答えて

26

必要に応じてスタティックヘルパーまたはラムダを使用します。 move semantics/elionをコメント内で指摘しておくと、ヘルパーが返すベクタの完全なコピーをすべて省略してコンパイルするので、かなり安いでしょう。代わりに、単一のベクトルを塗りつぶしてそのコードを使用するコードを作成します。ここ

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

+2

ところで、現在の標準によれば、あなたのラムダは ' - > std :: vector 'が必要だと思います。 –

+0

今、私は混乱しています。 gcc4.7とcl17.00で試してみましたが、どちらもそれを受け入れていますが、実際には以前のバージョンで両方を拒否していたようです。 – stijn

0

は機能にあなたの初期化をカプセル化し、constの式を初期化するためにそれを使用できるように、「constexprの」それを宣言します。

+3

ここで 'constexpr'は必要ありません。なぜなら、彼はコンパイル時定数式(' std :: vector'リターンは決してできない)を必要としないからです。 –

0

あなたはstd::transformを使用することができますだけでなくfuncがある

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

:私はあなたが今、このための答えを持って知っている

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

が可能ですが、OPは単一の* const *ベクトルを求めます。 – stijn

+0

@stijnオハイオ州はい。しかし、私は一時的な中間ベクトルを使用して、それをあなたのアプローチでも呼び出されている関数で作成したように 'const'ベクトルに割り当てることができます。 – Saksham

関連する問題