静的ベクトルを初期化する「より良い」方法は以下よりもあるのだろうか?
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()の値は独立して宣言されます。配列などではありません。
編集:それが不可能な場合は、それも教えてください:)
通常、使用するコンテナを構築するためのクラスがあります( this one from boost)。
const list<int> primes = list_of(2)(3)(5)(7)(11);
そうすれば、静的な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});
here を参照してください。
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};
C++ 11の場合:
std::vector<int> Foo::MyVector = {4, 17, 20};
これを試すことができます:
int arr[] = { 1,2,3,4,5,6,7,8,9 };
MyVector.insert(MyVector.begin(), arr, &arr[sizeof(arr)/ sizeof(*arr)]);
ただし、ベクトルが非常に長い場合にのみ価値があり、見た目もあまり良くありません。ただし、繰り返されるPush_back()呼び出しは取り除きます。もちろん、値が「配列内にない」場合は、最初に値をそこに配置する必要がありますが、コンテキストに応じて静的に(または少なくとも参照/ポインター)実行することができます。
静的オブジェクトを使用した初期化はどうですか。そのコンストラクターでは、オブジェクト内の静的関数を呼び出して初期化を行うことができます。
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をサポートしている場合は、初期化リストを使用してください。