std::vector VS cArray
-
also wie initialisiere ich einen vector so wie das beispiel des carrays:?
char* cArray[3]={"A","B","C"};vector<char*>vArray(3)??????????danke im voraus
buntehaare
-
vector<char const*> v = { "yay", "hell yeah", "piissosexy" };
-
Man sollte noch sagen, dass dies ein neues Feature im C++11er Standard ist und eventuell erst bei deinem Compiler aktiviert werden muss (auf älteren GCCs z.B. mit -std=c++0x). Dieses Feature ist jedoch nicht sehr exotisch, es sollte auch in älteren Compilern schon längst existieren.
-
314159265358979 schrieb:
vector<char const*> v = { "yay", "hell yeah", "piissosexy" };Error: initzialisation with {...] is not allowed for object of type std::vector, std::allocatorVisual Studio 2010
-
SeppJ schrieb:
Man sollte noch sagen, dass dies ein neues Feature im C++11er Standard ist und eventuell erst bei deinem Compiler aktiviert werden muss (auf älteren GCCs z.B. mit -std=c++0x). Dieses Feature ist jedoch nicht sehr exotisch, es sollte auch in älteren Compilern schon längst existieren.
na toll da predigen immer alle cArray's sind dem c++ vector so unterlegen wegen den Buffer über und unterläufen und und und ..., und dann kann man nicht einmal mit runden klammer initialisiseren soll man das dann so machen?
vector<char*>z(16); char* u[16]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; int xx=0; while(xx < 16){ z[xx]=u[xx]; xx++; }
-
Liegt nicht an vector, sondern daran, dass Microdoof zu blöd ist, den aktuellen Standard zu implementieren. Nimm den GCC, der ist im Moment allen anderen Compilern überlegen.
-
buntehaare schrieb:
vector<char*>z(16); char* u[16]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; int xx=0; while(xx < 16){ z[xx]=u[xx]; xx++; }Das geht aber auch wesentlich kürzer, selbst mit C++98:
char* u[16]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; vector<char*>z(u,u+16);
-
uuh sehr schön, aber .. wie funktioniert den das was passiert da ?
vector<char*>z(u,u+16);
-
http://www.cplusplus.com/reference/stl/vector/vector/
Dies ist Variante Nummer 3.
-
Das ist ein Range-Konstruktor. Der Vektor wird aus dem, was zwischen zwei Iteratoren (in diesem Fall Zeigern des Typs char const **) steht, zusammengesetzt. Wichtig dabei ist, dass der Werttyp der Iteratoren implizit in den Werttypen des Vektors umwandelbar ist.
Übrigens würde ich das wie folgt erweitern:
template<typename T, std::size_t N> std::size_t array_size(T(&)[N]) { return N; } ... char const *u[] = { "foo", "bar", "baz" }; std::vector<char const *> z(u, u + array_size(u));um doppelte Datenhaltung (der Arraylänge) zu vermeiden.
Außerdem sei auf Boost.Assign hingewiesen, womit man auch
std::vector<char const *> v; v += "foo", "bar", "baz", "qux";schreiben kann. Generell ist derartiger syntaktischer Zucker natürlich von untergeordneter Bedeutung; in den meisten Fällen stehen die Daten, die man in einen Vektor packen will, erfahrungsgemäß nicht zur Compilezeit fest.
-
seldon schrieb:
Übrigens würde ich das wie folgt erweitern:
template<typename T, std::size_t N> std::size_t array_size(T(&)[N]) { return N; } ... char const *u[] = { "foo", "bar", "baz" }; std::vector<char const *> z(u, u + array_size(u));Oder auch
char const *u[] = { "foo", "bar", "baz" }; std::vector<char const *> z(begin(u), end(u));ach nein, das ist ja auch C++11...
-
314159265358979 schrieb:
Liegt nicht an vector, sondern daran, dass Microdoof zu blöd ist, den aktuellen Standard zu implementieren. Nimm den GCC, der ist im Moment allen anderen Compilern überlegen.
Gibt es eigentlich keine Funktion, um Pi auszublenden?
-
seldon schrieb:
[...] in den meisten Fällen stehen die Daten, die man in einen Vektor packen will, erfahrungsgemäß nicht zur Compilezeit fest.
Genau! Und wenn man nur an einer unveränderlichen Lookuptabelle oder andere Konstanten interessiert ist, dann darf man auch ruhigen Gewissens "C-Arrays" verwenden statt std::vector und std::string.
-
kkkkllllll schrieb:
314159265358979 schrieb:
Liegt nicht an vector, sondern daran, dass Microdoof zu blöd ist, den aktuellen Standard zu implementieren. Nimm den GCC, der ist im Moment allen anderen Compilern überlegen.
Gibt es eigentlich keine Funktion, um Pi auszublenden?
Ja jemand hat mal ein Script im Forum veröffentlicht um Beiträge von bestimmten Usern zu verstecken.
PIs Beiträge sind zu 100% Bullshit.
-
314159265358979 schrieb:
Liegt nicht an vector, sondern daran, dass Microdoof zu blöd ist, den aktuellen Standard zu implementieren. Nimm den GCC, der ist im Moment allen anderen Compilern überlegen.
Den gcc würd ich auch gern verwenden, aber ich habe noch keine IDE gefunden die an visual studio 2010 + visual assist x rankommt.
Langsam wirds etwas offtopic
-
Q schrieb:
Langsam wirds etwas offtopic
Dann fütter ihn doch nicht auch noch.
Back to topic: Wenn die diversen C++11-Mechanismen noch nicht zur Verfügung stehen, sollte man sich wirklich wie von seldon erwähnt boost.Assign ansehen. So oder so sollte man sich im skizzierten Fall aber auch überlegen, ob ein std::array (oder boost::array) nicht die bessere Wahl wäre.
-
314159265358979 schrieb:
Liegt nicht an vector, sondern daran, dass Microdoof zu blöd ist, den aktuellen Standard zu implementieren. Nimm den GCC, der ist im Moment allen anderen Compilern überlegen.
Auch wenn ich mit der Ansicht, dass microschrott doof ist, zu 99% übereinstimme kann man nicht sagen, dass ihre Entwicklertools doof sind. Sicher der gcc ist dem Microsoft Compiler in Sachen c++11 Unterstützung überlegen, jedoch hat Microsoft schon einige Features implementiert.
-
MrKnister schrieb:
314159265358979 schrieb:
Liegt nicht an vector, sondern daran, dass Microdoof zu blöd ist, den aktuellen Standard zu implementieren. Nimm den GCC, der ist im Moment allen anderen Compilern überlegen.
Auch wenn ich mit der Ansicht, dass microschrott doof ist, zu 99% übereinstimme kann man nicht sagen, dass ihre Entwicklertools doof sind. Sicher der gcc ist dem Microsoft Compiler in Sachen c++11 Unterstützung überlegen, jedoch hat Microsoft schon einige Features implementiert.
Ja, und zwar jene, die keinen Aufwand machen:
- RValue-Referenzen: Das Verschieben von Objekten konnte der Optimierer im Hintergrund angeblich schon vorher, und jetzt kann der Benutzer das eben steuernauto: Der Typ des rechten Ausdrucks muss sowieso bestimmt werden,autodürfte ein ~10-Zeiler sein, genauso wienullptrund>> vs. > >static_assert: Simpellong long: Toll,__int64gibts ja auch noch gar nicht ewig..
Mehr Nennenswertes habe ich hier nicht gefunden.
Unterm Strich: Microsoft ist vielleicht nicht zu blöd, aber zu faul, C++11 zu implementieren. Sieht man ja an VS11, das kaum mehr bringt.
-
Liegt auch daran, dass das C++-Team unterbesetzt ist.
-
TyRoXx schrieb:
Unterm Strich: Microsoft ist vielleicht nicht zu blöd, aber zu faul, C++11 zu implementieren. Sieht man ja an VS11, das kaum mehr bringt.
Ich würde eher sagen: Du bist vielleicht nicht zu blöd, aber zu faul, um dich richtig zu informieren. Lambdas wären noch erwähnenswert gewesen. Aber viel wichtiger: http://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-Live-at-BUILD-Herb-Sutter-Joanna-Mason-Tony-Goodhew