2010-11-24 24 views
50

文字列のベクトル配列を初期化することは可能でしょうか?例えば文字列のベクトル配列を初期化する

:クラスのメンバ

として宣言

static std::vector<std::string> v; //私はただの文字列で初期化し、埋めるためにstaticを使用。それとも、私たちは通常の配列を行うように初期化できない場合は、コンストラクタでそれを埋める必要があります。

+0

から正確に、何でそれを初期化しますか?もちろん、それを初期化するための無数の方法があります。 –

+0

'static'は「文字列で埋めていません」。 std :: vectorは動的データ構造であり、空に作成されます。 – Blastfurnace

+0

ここで 'static'は、クラスの複数のインスタンスがすべて同じ' v'を共有しているということです。 – birryree

答えて

55

の並び替え:

class some_class { 
    static std::vector<std::string> v; // declaration 
}; 

const char *vinit[] = {"one", "two", "three"}; 

std::vector<std::string> some_class::v(vinit, end(vinit)); // definition 

endはちょうどので、私はする必要はありませんですvinit+3と書いてください。長さが後で変わる場合は最新の状態にしておいてください。それを定義します。C++ 0xのでは、あなただけの配列と同様のコンテナを初期化することができるようになります

template<typename T, size_t N> 
T * end(T (&ra)[N]) { 
    return ra + N; 
} 
+2

ええええ、私は賢いテンプレートを含むことはなかった 'end' :) –

+0

私はちょうど使用することができますint numElements = sizeof(vinit)/ 4; – cpx

+0

@cpx: 'sizeof(char *)'が4の場合、yesです。それほど多くの64ビットマシンではありません。配列を反復するたびにたくさんの 'sizeof' stuffを入力することに飽き飽きしました。私の 'end'関数はC++ 0xの' std :: end'と同じ配列に影響します。 –

14
const char* args[] = {"01", "02", "03", "04"}; 
std::vector<std::string> v(args, args + 4); 

そして、C++ 0xの中に、あなたはstd::initializer_list<>を活用することができます:

http://en.wikipedia.org/wiki/C%2B%2B0x#Initializer_lists

+1

+1の簡単な言及のための+1は、あまりにも悪いMSVC 2010はまだこの動作をサポートしていません:( – rubenvb

5

const char* args[] = {"01", "02", "03", "04"}; 
std::vector<std::string> v(args, args + sizeof(args)/sizeof(args[0])); //get array size 
+1

これは、initリスト内のすべてのargs []が同じサイズであると仮定していませんか? – jwillis0720

+1

@ jwillis0720:すべてのargs [n]は、正確にはsizeof(char *)と同じサイズです。その理由は、argsが "thing"自体ではなく "thing"にポインタ(char *)を格納するからです。 –

9

MSVCベクターの場合はstd::initializer_list<>をサポートしていませんが、サポートしているため、2010ソリューションです。std::end

const char *args[] = {"hello", "world!"}; 
std::vector<std::string> v(args, std::end(args)); 
22

あなたがcpp11を使用している場合、あなたは、単にこのようなベクターを初期化することができ、(必要に応じて-std=c++0xフラグを有効にする):

// static std::vector<std::string> v; 
v = {"haha", "hehe"}; 
2

それは2017年ですが、このスレッドは私の検索エンジンでトップです本日、以下の方法が好ましい(初期化子リスト)

std::vector<std::string> v = { "xyzzy", "plugh", "abracadabra" }; 
std::vector<std::string> v({ "xyzzy", "plugh", "abracadabra" }); 
std::vector<std::string> v{ "xyzzy", "plugh", "abracadabra" }; 

https://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists