2012-01-26 18 views
5

std::stringの配列を使ってベクトルを初期化したいとします。std :: stringのベクトルを配列で初期化する

私は以下の解決策を持っていますが、これを行うもっとエレガントな方法があるのだろうか?

int size = (sizeof (str)/sizeof (std::string)); 

として、ベクターの初期化を置き換える:

std::string str[] = { "one", "two", "three", "four" }; 
vector<std::string> vec; 
vec = vector<std::string>(str, str + (sizeof (str)/sizeof (std::string))); 
次のように私は、もちろん、サイズを定義することで、これは読みやすくすることができ

vec = vector<std::string>(str, str + size); 

しかし、これはまだ感じています少し "控えめな"。

+0

http://stackoverflow.com/questions/231491/how-to-initialize-const-stdvectort-like-ac-array –

答えて

4

まあ中間ステップは必要ありません。

std::string str[] = { "one", "two", "three", "four" }; 
vector<std::string> vec(str, str + (sizeof (str)/sizeof (std::string))); 

11 C++で使用すると、初期化リストコンストラクタを使用して、コンストラクタでブレースの初期化を置くことができると思います。 C++ 11では

+0

おかげで、私は完全に他を逃しただろうかどうか特定できなかった参照してください。ものを初期化する潜在的な方法。 –

3

、我々はstd::beginstd::end、STL形式のコンテナと、組み込み配列の両方のための仕事があります

#include <iterator> 

std::vector<std::string> vec(std::begin(str), std::end(str)); 

コメントで述べたように、あなたが普通ではないだろう、けれどもすべての中間配列必要があります:C++ 03では

std::vector<std::string> vec {"one", "two", "three", "four"}; 

を、あなた自身のbeginendを実装するために、または直接配列を初期化するか、配列の大きさを推定するためにテンプレートを使用することができます。

template <typename T, size_t N> 
std::vector<T> make_vector(T &(array)[N]) { 
    return std::vector<T>(array, array+N); 
} 

std::vector<std::string> vec = make_vector(str); 
+2

C++ 11には適切な初期化子があり、最初のメソッドは必要ありません。 –

+0

@ KonradRudolph:良い点(質問は特に配列からの初期化について尋ねていますが、答えにそのメソッドを残しておきます)。 –

+2

C++ 11以前では、私たちの個人用ツールキットに 'begin'と' end'がありました。そしてそれらは主にpre-C++ 11に関係しています。 –

関連する問題