46

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

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

これはサンプルコードです:)

push_back() の値は個別に宣言されます。配列などではありません。

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

4

6 に答える 6

53

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

std::vector<int> 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 <boost/assign/list_of.hpp>

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

C ++ 11以降では、中括弧の初期化を使用できます。

std::vector Foo::MyVector = {4,17,20};
于 2010-09-13T16:23:07.607 に答える
28

通常、私が使用するコンテナーを構築するためのクラスがあります ( boost のこのような)。次のことができます。

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

そうすれば、偶発的な変更を避けるために static const も作成できます。

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

// Foo.h

class Foo {
  static const vector<int> something;
}

// Foo.cc

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

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

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

ここを参照してください。

于 2010-09-13T15:45:11.310 に答える
27

C++11 の場合:

//The static keyword is only used with the declaration of a static member, 
//inside the class definition, not with the definition of that static member:
std::vector<int> Foo::MyVector = {4, 17, 20};
于 2012-10-25T20:36:46.243 に答える
2

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

于 2012-09-18T01:03:53.253 に答える
2

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

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

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

于 2010-09-13T15:48:35.253 に答える
0

boostを使用すると、boost ::assign名前空間で定義された+=()演算子を使用できます。

#include <boost/assign.hpp>

using namespace boost::assign;

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

または静的初期化を使用:

#include <boost/assign.hpp>

using namespace boost::assign;

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

int main()
{
    return 0;
}

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

于 2012-11-24T20:02:38.187 に答える