2012-01-26 36 views
5

我想用std::string的數組初始化一個向量。用數組初始化std :: string的向量

我有以下解決方案,但想知道是否有更優雅的方式來做到這一點?

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

我可以,當然,如下使這更可讀通過定義大小:

int size = (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))); 

在C++ 11你可以把支架初始化使用初始化列表構造函數的構造。

+0

謝謝,我不能肯定我是否會完全錯過任何其他潛在的初始化事物的方法。 –

3

在C++ 11,我們有std::beginstd::end,這對於STL風格的容器和內置陣列都工作:

#include <iterator> 

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

不過,正如在評論中提到的,你通常不會需要中間陣列全天:

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

在C++ 03,你可以使用模板來推斷出數組的大小,既可以實現自己的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相關。 –