2012-01-26 34 views
5

Chciałbym zainicjować wektor używając tablicy std::string s.Inicjalizacja wektora std :: string z tablicą

Mam następujące rozwiązanie, ale zastanawiałem się, czy istnieje bardziej elegancki sposób robienia tego?

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

Mógłbym, oczywiście, zrobić to bardziej czytelne poprzez określenie rozmiaru, co następuje:

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

i zastąpienie inicjalizacji wektorowych z:

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

Ale to nadal czuje się mały "nieelegancki".

+0

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

Odpowiedz

4

Dobrze etap pośredni nie jest potrzebna:

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

w C++ 11 byłbyś w stanie umieścić inicjalizacji nawiasów w konstruktorze przy użyciu konstruktora listy inicjator.

+0

Dzięki, nie byłem pewien, czy ja całkowicie brakowało jakiegokolwiek innego potencjalne metody inicjowania rzeczy. –

3

w C++ 11, mamy std::begin i std::end, które pracują dla obu pojemników STL stylu oraz wbudowanych tablic:

#include <iterator> 

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

chociaż, jak wspomniano w komentarzach, zwykle nie będzie potrzebują pośredni tablicę na wszystkich:

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

w C++ 03, można użyć szablonu wydedukować wielkość tablicy, albo zaimplementować własną begin i end lub inicjalizacja tablicy bezpośrednio:

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

W C++ 11 mamy odpowiednie inicjatory, nie potrzebujemy pierwszej z twoich metod. –

+0

@KonradRudolph: dobry punkt (chociaż pytanie w szczególności pyta o inicjowanie z tablicy, więc zostawię tę metodę w odpowiedzi). –

+2

Na długo przed C++ 11, mieliśmy 'rozpocząć' i' koniec' w naszym osobistym zestawie narzędzi. Są one głównie związane z pre-C++ 11. –

Powiązane problemy