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 static
nur 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.
static
füllt es nicht mit Strings. Der std :: vector ist eine dynamische Datenstruktur und wird leer erstellt.static
In diesem Zusammenhang bedeutet dies, dass mehrere Instanzen Ihrer Klasse alle dasselbe teilen.v
Wollen Sie das wirklich?Antworten:
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
end
ist nur so, dass ich nicht schreibenvinit+3
und 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; }
quelle
sizeof(char*)
4 ist, ja. Nicht so sehr auf einer 64-Bit-Maschine. Mir war es einfach langweilig,sizeof
jedes Mal, wenn ich ein Array iteriere, ein paar Sachen zu tippen. Meineend
Funktion hat für Arrays den gleichen Effekt wiestd::end
in C ++ 0x.end
Funktion sage, meine ich die Funktionsvorlage in meiner Antwort im Gegensatz zu C ++ 0xstd::end
. Ich behaupte nicht, es erfunden zu haben!N
wird wie3
aus dem Typ des Arguments abgeleitetvinit
, das istconst char* [3]
. ImT
Übrigen wird auchconst char *
von diesem Typ abgeleitet. Schreibenend(vinit)
ist also wie Schreibenend<const char*, 3>(vinit)
dank Abzug von Vorlagenparametern.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
quelle
Wenn Sie cpp11 verwenden (
-std=c++0x
bei Bedarf mit dem Flag aktivieren ), können Sie den Vektor einfach wie folgt initialisieren:// static std::vector<std::string> v; v = {"haha", "hehe"};
quelle
const char* args[] = {"01", "02", "03", "04"}; std::vector<std::string> v(args, args + 4);
Und in C ++ 0x können Sie Folgendes nutzen
std::initializer_list<>
:http://en.wikipedia.org/wiki/C%2B%2B0x#Initializer_lists
quelle
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));
quelle
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
quelle
Schau es dir an
boost::assign
.quelle
In C ++ 0x können Sie Container genau wie Arrays initialisieren
http://www2.research.att.com/~bs/C++0xFAQ.html#init-list
quelle