Initialisieren Sie ein Vektorarray von Zeichenfolgen

73

Wäre es möglich, ein Vektorarray von Strings zu initialisieren?

zum Beispiel:

static std::vector<std::string> v; // als Klassenmitglied deklariert

Ich habe es staticnur initialisiert und mit Strings gefüllt. Oder sollte ich es einfach in den Konstruktor eintragen, wenn es nicht wie bei normalen Arrays initialisiert werden kann.

cpx
quelle
Initialisieren Sie es mit was genau? Es gibt natürlich unzählige Möglichkeiten, es zu initialisieren.
Benjamin Lindley
staticfüllt es nicht mit Strings. Der std :: vector ist eine dynamische Datenstruktur und wird leer erstellt.
Blastfurnace
staticIn diesem Zusammenhang bedeutet dies, dass mehrere Instanzen Ihrer Klasse alle dasselbe teilen. vWollen Sie das wirklich?
wkl

Antworten:

65

Art von:

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

endist nur so, dass ich nicht schreiben vinit+3und auf dem neuesten Stand halten muss, wenn sich die Länge später ändert. Definieren Sie es als:

template<typename T, size_t N>
T * end(T (&ra)[N]) {
    return ra + N;
}
Steve Jessop
quelle
Kann ich einfach int numElements = sizeof (vinit) / 4 verwenden?
cpx
@cpx: Wenn sizeof(char*)4 ist, ja. Nicht so sehr auf einer 64-Bit-Maschine. Mir war es einfach langweilig, sizeofjedes Mal, wenn ich ein Array iteriere, ein paar Sachen zu tippen. Meine endFunktion hat für Arrays den gleichen Effekt wie std::endin C ++ 0x.
Steve Jessop
Falls es nicht offensichtlich ist, wenn ich "meine" endFunktion sage, meine ich die Funktionsvorlage in meiner Antwort im Gegensatz zu C ++ 0x std::end. Ich behaupte nicht, es erfunden zu haben!
Steve Jessop
@SteveJessop kannst du erklären, wie das Ende funktioniert? Ich kann es nicht herausfinden. Es nimmt N auch als Argument, aber Sie geben es nicht ....
Roozbeh G
1
@RoozbehG: Nwird wie 3aus dem Typ des Arguments abgeleitet vinit, das ist const char* [3]. Im TÜbrigen wird auch const char *von diesem Typ abgeleitet. Schreiben end(vinit)ist also wie Schreiben end<const char*, 3>(vinit)dank Abzug von Vorlagenparametern.
Steve Jessop
51

Es ist 2017, aber dieser Thread ist in meiner Suchmaschine ganz oben. Heute werden die folgenden Methoden bevorzugt (Initialisierungslisten).

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

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

Alleo
quelle
33

Wenn Sie cpp11 verwenden ( -std=c++0xbei Bedarf mit dem Flag aktivieren ), können Sie den Vektor einfach wie folgt initialisieren:

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

MSVC 2010-Lösung, da sie keine std::initializer_list<>Vektoren unterstützt, aber unterstütztstd::end

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

wie @ Moo-Juice:

const char* args[] = {"01", "02", "03", "04"};
std::vector<std::string> v(args, args + sizeof(args)/sizeof(args[0])); //get array size
Mark Kahn
quelle
1
Geht dies nicht davon aus, dass alle Argumente [] in der Init-Liste dieselbe Größe haben?
jwillis0720
1
@ jwillis0720: Alle Argumente [n] haben tatsächlich die gleiche Größe, genauer gesagt die Größe von (char *). Der Grund ist, dass args einen Zeiger (char *) auf das "Ding" speichert, nicht auf das "Ding" selbst.
Jürgen Schwietering