vector intialisierung
-
vector<string> test; test.resize(3); test[0] = "a"; test[1] = "b"; test[2] = "c";Kann man das vereinfachen, wenn man zum Beispiel mehrere hundert Elemente so abspeichern will?
-
Mit
initializer lists(falls dein Compiler das schon unterstützt) oder mitpush_back(..).Edit:
Wobei die Abkürzung nicht sehr gross ist. Falls der Folge der Element eine Regel zugrunde liegt, kannst Du das z.B. auch mit einer Schleife machen (z.B. alle Buchstaben von A-Z oder so).
-
Oh ja, mit C++11 lässt sich dank Uniform/Aggregate-Initialization Folgendes schreiben:
std::vector<std::string> test { "a", "b", "c" };
-
std::vector<char> v(boost::counting_iterator<char>('a'), boost::counting_iterator<char>('z'+1)); //a-z
-
Außerdem geht auch folgende Variante (C++98):
char const *arr[] = { "a", "b", "c" }; std::vector<std::string> test(arr, arr + sizeof arr / sizeof *arr);
-
asagggggg schrieb:
Kann man das vereinfachen, wenn man zum Beispiel mehrere hundert Elemente so abspeichern will?
In C++11:
vector<string> test = {"a", "b", "c"};In C++98:
const static string test_src[] = {"a", "b", "c"}; template <class T, unsigned N> inline unsigned countof(T(&)[N]) {return N;} vector<string> test(test_src, test_src+countof(test_src));Oder mit Boost.Assign:
vector<string> test = boost::assign::list_of("a")("b")("c"); //oder vector<string> test; using namespace boost::assign; test += "a", "b", "c";Vielleicht sind dir bei Boost.Assign auch repeat() und range() eine Hilfe.
-
pumuckl schrieb:
In C++98:
const static string test_src[] = {"a", "b", "c"}; template <class T, unsigned N> inline unsigned countof(T(&)[N]) {return N;} vector<string> test(test_src, test_src+countof(test_src));Ist das im Gegensatz zu meiner Variante nicht ein wenig Overkill?
-
Sone schrieb:
pumuckl schrieb:
In C++98:
const static string test_src[] = {"a", "b", "c"}; template <class T, unsigned N> inline unsigned countof(T(&)[N]) {return N;} vector<string> test(test_src, test_src+countof(test_src));Ist das im Gegensatz zu meiner Variante nicht ein wenig Overkill?
Kommt drauf an, wie oft du es in deinem Programm brauchst. Wenn es öfters gebraucht wird, lager es aus... Abstraktion.
-
out schrieb:
Sone schrieb:
pumuckl schrieb:
In C++98:
const static string test_src[] = {"a", "b", "c"}; template <class T, unsigned N> inline unsigned countof(T(&)[N]) {return N;} vector<string> test(test_src, test_src+countof(test_src));Ist das im Gegensatz zu meiner Variante nicht ein wenig Overkill?
Kommt drauf an, wie oft du es in deinem Programm brauchst. Wenn es öfters gebraucht wird, lager es aus... Abstraktion.
Na und? Der Template-Kram ist nach wie vor Overbloat/kill:
#define count(arr) (sizeof (arr) / sizeof (*arr))
-
void foo(int bar[2]) { cout << count(bar); }C laesst gruessen.
-
Kellerautomat schrieb:
void foo(int bar[2]) { cout << count(bar); }C laesst gruessen.
Schon klar, aber wenn der Programmierer so ein Idiot ist, soll er das Makro auch nicht benutzen.
-
Na und? Der Template-Kram ist nach wie vor Overbloat/kill:
Hmm ... ich mag die zwei Zeilen. Der Compiler sollte es zur Konstanten reduzieren. Von Overkill kann nicht die Rede sein.
-
knivil schrieb:
Der Compiler sollte es zur Konstanten reduzieren.
Na gut, das ist natürlich schön.
Btw, jetzt gehts auch mit Fehlererkennung:

#include <type_traits> #include <stdexcept> #define count(arr) (std::is_array<decltype(arr)>::value ? sizeof (arr) / sizeof (*arr) : (throw std::logic_error("Wrong type."), 0))
-
Erstmal vielen Dank für die Hilfe.
Leider scheint VS 2012
std::vector<std::string> test = { "a", "b", "c" };... nicht zu unterstützen. Ich bekomme folgende Fehlermeldung:
Initialisierung nicht zusammengesetzter Typen mit Initialisierungsliste ist nicht möglich.
Kann man das irgendwie beheben? Ansonsten mache ich es halt mit einer der anderen vorgeschlagenen Lösungen.
-
asfsafsaf schrieb:
Kann man das irgendwie beheben?
- GCC oder CLANG benutzen (VS11 unterstützt das wie man sieht noch nicht)
- auf MSVC 2015 warten
-
Sone schrieb:
Btw, jetzt gehts auch mit Fehlererkennung
Du hast den Sinn von exceptions noch nicht verstanden, stimmts?

-
pumuckl schrieb:
asfsafsaf schrieb:
Kann man das irgendwie beheben?
- GCC oder CLANG benutzen (VS11 unterstützt das wie man sieht noch nicht)
- auf MSVC 2015 warten
Nö, Gott sei dank nich. Sie wollen zukünftig weitere C++11 Features in VS11 integrieren. Ob das mit verschiedenen Updates einhergehen wird oder mit einem SP, weiß ich nicht, dazu wurde keine Aussage gemacht.
-
roflkopter schrieb:
Sone schrieb:
Btw, jetzt gehts auch mit Fehlererkennung
Du hast den Sinn von exceptions noch nicht verstanden, stimmts?

Äh, ich glaub schon. Das war, und das hättest du mit kontextbezogenerem Lesen auch gemerkt, als Späßle gemeint.
-
out schrieb:
Nö, Gott sei dank nich. Sie wollen zukünftig weitere C++11 Features in VS11 integrieren.
Na gut, aber mit welchem Tempo? Dann halt VS11, Servicepack 18 (kommt 2015 raus)

-
pumuckl schrieb:
out schrieb:
Nö, Gott sei dank nich. Sie wollen zukünftig weitere C++11 Features in VS11 integrieren.
Na gut, aber mit welchem Tempo? Dann halt VS11, Servicepack 18 (kommt 2015 raus)

Ja schon :D. Zu den weiteren Features zählen übrigens, initializer list, template aliases, variadic templates, constexpr, noexcept =default und delete. Weihnachten is ja bald

-
out schrieb:
Ja schon :D. Zu den weiteren Features zählen übrigens, initializer list, template aliases, variadic templates, constexpr, noexcept =default und delete. Weihnachten is ja bald

Jau wünsch dir was. Und es gibt Stricksocken...