web-dev-qa-db-fra.com

Initialiser un tableau vectoriel de chaînes

Serait-il possible d'initialiser un tableau vectoriel de chaînes.

par exemple:

static std::vector<std::string> v; // déclaré en tant que membre de la classe

J'ai utilisé static juste pour l'initialiser et le remplir avec des chaînes. Ou devrais-je simplement le remplir dans le constructeur s'il ne peut pas être initialisé comme nous le faisons avec des tableaux classiques.

63
cpx

Sorte de:

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 est juste pour que je n'ai pas à écrire vinit+3 et le garder à jour si la longueur change plus tard. Définissez-le comme:

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

Si vous utilisez cpp11 (activez-le avec le -std=c++0x flag si nécessaire), vous pouvez simplement initialiser le vecteur comme ceci:

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

Nous sommes en 2017, mais ce fil est en tête de mon moteur de recherche. Aujourd'hui, les méthodes suivantes sont préférées (listes d'initialisation).

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

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

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

Et en C++ 0x, vous pouvez tirer parti de std::initializer_list<>:

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

15
Moo-Juice

Solution MSVC 2010, car elle ne supporte pas std::initializer_list<> pour les vecteurs mais il supporte std::end

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

idem @ Moo-Juice:

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

Jeter un coup d'œil à boost::assign .

2
Nikolai Fetissov

En C++ 0x, vous pourrez initialiser les conteneurs exactement comme des tableaux

http://www2.research.att.com/~bs/C++0xFAQ.html#init-list

1
David