6

例えば

struct A
{
    static vector<int> s;
};

vector<int> A::s = {1, 2, 3};

ただし、私のコンパイラは初期化リストをサポートしていません。簡単に実装する方法はありますか?ラムダ関数はここで役立ちますか?

4

5 に答える 5

4

簡単に実装する方法はありますか?

特にエレガントなものはありません。静的配列からデータをコピーするか、関数呼び出しの結果で初期化することができます。前者は必要以上に多くのメモリを使用する可能性があり、後者は少し厄介なコードが必要です。

Boostには、それを少し見苦しくするためのライブラリがあります:

#include <boost/assign/list_of.hpp>
vector<int> A::s = boost::assign::list_of(1)(2)(3);

ラムダ関数はここで役立ちますか?

はい、ベクトルを初期化するためだけに関数に名前を付ける必要がなくなります。

vector<int> A::s = [] {
    vector<int> v;
    v.push_back(1);
    v.push_back(2); 
    v.push_back(3);
    return v;
}();

(厳密に言えば、[]()->vector<int>ラムダ本体には単なるステートメント以上のものが含まれているため、これには明示的な戻り値の型が必要returnです。一部のコンパイラは私のバージョンを受け入れ、2014 年には標準になると思います。)

于 2013-09-17T15:32:09.117 に答える
3

ベクトルの簡単な init 関数を記述します。

vector<int> init()
{
  vector<int> v;
  v.reserve(3);
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  return v;
};

vector<int> A::s = init();
于 2013-09-17T15:20:45.517 に答える
1

std::vector2つのポインターから初期化でき ます

int xv[] = {1,2,3,4,5,6,7,8,9};
std::vector<int> x(xv, xv+(sizeof(xv)/sizeof(xv[0])));

テンプレート関数でこれを除外することもできます。

template<typename T, int n>
std::vector<T> from_array(T (&v)[n]) {
    return std::vector<T>(v, v+n);
}
于 2013-09-17T15:15:11.657 に答える