2010-11-24 3 views
50

Можно ли инициализировать векторный массив строк.Инициализировать векторный массив строк

, например:

static std::vector<std::string> v; // объявлен как класс члена

я использовал static только для инициализации и заполнить его со строками. Или я должен просто заполнить его в конструкторе, если он не может быть инициализирован, как и обычные массивы.

+0

Инициализировать его с чем именно? Конечно, существует множество способов инициализации. – 2010-11-24 16:15:03

+0

`static` не« заполняет его строками ». Std :: vector - динамическая структура данных и создается пустым. – Blastfurnace 2010-11-24 16:15:07

+0

`static` в этом контексте означает, что несколько экземпляров вашего класса все используют один и тот же` v`, это то, что вы действительно хотите? – birryree 2010-11-24 16:15:47

ответ

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 и сохраните его в актуальном состоянии, если длина изменится позже. Определим его как:

template<typename T, size_t N> 
T * end(T (&ra)[N]) { 
    return ra + N; 
} 
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 для упоминания простейшего способа в C++ 0x, слишком плохо MSVC 2010 пока не поддерживает это поведение :( – rubenvb 2010-11-24 16:45:21

5

же, как @ Му Сок:

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

MSVC 2010, так как он не поддерживает std::initializer_list<> для векторов, но поддерживает 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