33


6

静的ベクトルの初期化

静的ベクトルを初期化する「より良い」方法は以下よりもあるのだろうか?

class Foo
{
    static std::vector MyVector;
    Foo()
    {
        if (MyVector.empty())
        {
            MyVector.push_back(4);
            MyVector.push_back(17);
            MyVector.push_back(20);
        }
    }
}

サンプルコードです:)

push_back()の値は独立して宣言されます。配列などではありません。

編集:それが不可能な場合は、それも教えてください:)

6 Answer


47


C ++ 03では、最も簡単な方法はファクトリ関数を使用することでした:

std::vector MakeVector()
{
    std::vector v;
    v.push_back(4);
    v.push_back(17);
    v.push_back(20);
    return v;
}

std::vector Foo::MyVector = MakeVector(); // can be const if you like

「戻り値の最適化」とは、懸念がある場合、配列が所定の位置に書き込まれ、コピーされないことを意味する必要があります。 または、配列から初期化することもできます。

int a[] = {4,17,20};
std::vector Foo::MyVector(a, a + (sizeof a / sizeof a[0]));

非標準ライブラリの使用を気にしない場合は、Boost.Assignmentを使用できます。

#include

std::vector Foo::MyVector = boost::list_of(4,17,20);

C ++ 11以降では、ブレースの初期化を使用できます。

std::vector Foo::MyVector = {4,17,20};


27


通常、使用するコンテナを構築するためのクラスがあります(http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html#list_of[this one]からboostなど)あなたができること:

const list primes = list_of(2)(3)(5)(7)(11);

そうすれば、静的なconstを作成して、偶発的な変更を避けることができます。

静的の場合、これを.ccファイルで定義できます。

// Foo.h

class Foo {
  static const vector something;
}

// Foo.cc

const vector Foo::something = list_of(3)(5);

C ++ Oxには、初期化リストを使用してこれを行うための言語メカニズムがあるため、次のようにできます。

const vector primes({2, 3, 5, 7, 11});

http://en.wikipedia.org/wiki/C%2B%2B0x#Initializer_lists [こちら]をご覧ください。


18


C ++ 11の場合:

std::vector Foo::MyVector = {4, 17, 20};


2


これを試すことができます:

int arr[] = { 1,2,3,4,5,6,7,8,9 };
MyVector.insert(MyVector.begin(), arr, &arr[sizeof(arr)/ sizeof(*arr)]);

ただし、ベクトルが非常に長い場合にのみ価値があり、見た目もあまり良くありません。 ただし、繰り返されるpush_back()呼び出しは取り除きます。 もちろん、値が「配列内にない」場合は、最初に値をそこに配置する必要がありますが、コンテキストに応じて静的に(または少なくとも参照/ポインター)実行することができます。


1


静的オブジェクトを使用した初期化はどうですか。 そのコンストラクターでは、オブジェクト内の静的関数を呼び出して初期化を行うことができます。


0


boostでは、boost

assign名前空間で定義されている+ =()演算子を使用できます。

#include

using namespace boost::assign;

int main()
{
    static std::vector MyVector;
    MyVector += 4,17,20;
    return 0;
}

または静的初期化あり:

#include

using namespace boost::assign;

static std::vector myVector = list_of(4)(17)(2);

int main()
{
    return 0;
}

コンパイラがC ++ 11をサポートしている場合は、初期化リストを使用してください。