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.


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;
}

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


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"};


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));

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

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.