Wenn Sie die Größe von ints nach der Initialisierung nicht ändern möchten, sollten Sie die Verwendung des tr1-Arrays in Betracht ziehen.
– zr.
10. Februar 2010 um 11:21 Uhr
@zr, du hast mich neugierig gemacht … wenn ich eine feste Größe bräuchte, könnte ich dann nicht einfach alte Arrays selbst verwenden? Betrachte gerade das tr1-Array …
– Agnel Kurian
10. Februar 2010 um 11:53 Uhr
tr1::array ist nützlich, da gewöhnliche Arrays nicht die Schnittstelle von STL-Containern bieten
– Manuel
10. Februar 2010 um 12:21 Uhr
Der Titel wurde geändert, um dies explizit zu einer C++03-Frage zu machen. Es schien einfacher, als alle Antworten durchzugehen und zu korrigieren, damit sie mit dem neuen Standard C++ sinnvoll sind.
Wenn Ihr Compiler C++11 unterstützt, können Sie einfach Folgendes tun:
std::vector<int> v = {1, 2, 3, 4};
Dies ist in GCC verfügbar ab Version 4.4. Leider scheint VC++ 2010 in dieser Hinsicht hinterherzuhinken.
Alternativ die Boost.Assign Die Bibliothek verwendet Nicht-Makro-Magie, um Folgendes zu ermöglichen:
#include <boost/assign/list_of.hpp>
...
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);
Oder:
#include <boost/assign/std/vector.hpp>
using namespace boost::assign;
...
std::vector<int> v;
v += 1, 2, 3, 4;
Aber denken Sie daran, dass dies einen gewissen Overhead hat (im Grunde genommen list_of baut ein std::deque unter der Haube), also sollten Sie für leistungskritischen Code besser tun, was Yacoby sagt.
Da Vektoren ihre Größe selbst bestimmen, wäre es in Ordnung, sie auch als leer zu initialisieren? Wie im Konstruktor: this->vect = {}; ?
– Azurespot
8. März 2018 um 2:03 Uhr
@Azurespot Sie können es einfach initialisieren und es wird leer sein: std::vector<T> vector;
– Lukas
5. April 2018 um 23:33 Uhr
Nur für den Fall, dass jemand neugierig sein könnte std::vector<int> v = {1, 2, 3, 4};Vektoren initializer list constructor wird für diese Art der Initialisierung aufgerufen, das Dokument ist in der zu finden C++ 11 Sektion.
– simomo
1. März 2019 um 15:48 Uhr
Yacoby
Eine Methode wäre, das Array zu verwenden, um den Vektor zu initialisieren
@Agnel Es wird gut ohne funktionieren static oder constaber beide machen deutlicher, wie es verwendet werden sollte, und ermöglichen dem Compiler, zusätzliche Optimierungen vorzunehmen.
– Yacoby
10. Februar 2010 um 16:55 Uhr
Ich habe das nicht abgelehnt, aber ich war versucht. Hauptsächlich, weil Sie dadurch fast nichts sparen, wenn Sie nur das initialisierte Array verwenden. Das ist jedoch wirklich die Schuld von C++, nicht Ihre.
– TED
3. Mai 2011 um 18:50 Uhr
Können Sie erklären, warum Sie diese Parameter beim Definieren des vec-Vektors verwenden.
– DomX23
27. Januar 2012 um 5:23 Uhr
sizeof(array) ist eine der wenigen Ausnahmen, die es erlaubt, die Gesamtgröße der Elemente des Arrays und NICHT die Dimension des arr-Zeigers zu erhalten. Also im Grunde verwendet er vector(pointer_to_first_element, pointer_to_first_element + size_in_bytes_of_the_whole_array / size_of_one_element), das heißt: vector(pointer_to_first_element, pointer_after_final_element). Der Typ wird bereits mit dem angegeben, sodass der Vektor weiß, wie viel ein Element ist. Denken Sie daran, dass Iteratoren als Zeiger behandelt werden können, sodass Sie im Grunde den Konstruktor vector(iterator begin, iterator end) verwenden
– Johnny Pauling
17. August 2012 um 12:58 Uhr
@TED: Manchmal müssen Sie den resultierenden Vektor ändern. Beispielsweise müssen Sie möglicherweise immer einige Standardparameter haben und manchmal einige angepasste Parameter hinzufügen.
– Dunkler Wanderer
18. Februar 2014 um 9:24 Uhr
Adam Erickson
Verwenden Sie nach Möglichkeit das moderne C++[11,14,17,20,…] Weg:
std::vector<int> ints = {10, 20, 30};
Die alte Art, ein Array mit variabler Länge zu durchlaufen oder zu verwenden sizeof() ist wirklich schrecklich für die Augen und völlig unnötig in Bezug auf den mentalen Overhead. Yuck.
Fairerweise war dies ursprünglich eine C++03-Frage, aber ich hoffe, dass Menschen/Unternehmen die neuen Standards übernehmen. C++ benötigt weiterhin eine VLA-Implementierung (Variable-length Array) in der Standardbibliothek, ähnlich der, die in Eigen und Boost verfügbar ist.
Wenn “Listeninitialisierung eines Aggregats aus einem Objekt des gleichen Typs” Ihr Ding ist, gibt es wahrscheinlich größere Probleme in Ihrer Codebasis … Mir fällt keine Anwendung ein, bei der dies die Debugging-Probleme rechtfertigen würde.
– Adam Erickson
20. Juni 2019 um 23:30 Uhr
Antwort von 2018 und immer noch verwendet ={}?
– Überhaupt niemand
3. August 2020 um 15:01 Uhr
Immer noch keine Notwendigkeit =
– BackslashN
13. September 2020 um 13:34 Uhr
David Rodríguez – Dribeas
In C++0x können Sie das genauso machen wie mit einem Array, aber nicht im aktuellen Standard.
Nur mit Sprachunterstützung können Sie Folgendes verwenden:
int tmp[] = { 10, 20, 30 };
std::vector<int> v( tmp, tmp+3 ); // use some utility to avoid hardcoding the size here
Wenn Sie andere Bibliotheken hinzufügen können, könnten Sie boost::assignment ausprobieren:
vector<int> v = list_of(10)(20)(30);
So vermeiden Sie die Festcodierung der Größe eines Arrays:
// option 1, typesafe, not a compile time constant
template <typename T, std::size_t N>
inline std::size_t size_of_array( T (&)[N] ) {
return N;
}
// option 2, not typesafe, compile time constant
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
// option 3, typesafe, compile time constant
template <typename T, std::size_t N>
char (&sizeof_array( T(&)[N] ))[N]; // declared, undefined
#define ARRAY_SIZE(x) sizeof(sizeof_array(x))
#include <vector>
using std::vector;
...
static const int arr[] = {10,20,30};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );
Herkömmliche STL mit generischen Makros:
#include <vector>
#define ARRAY_SIZE(ar) (sizeof(ar) / sizeof(ar[0])
#define ARRAY_END(ar) (ar + ARRAY_SIZE(ar))
using std::vector;
...
static const int arr[] = {10,20,30};
vector<int> vec (arr, ARRAY_END(arr));
Herkömmliche STL mit einem Vektor-Initialisierer-Makro:
#include <vector>
#define INIT_FROM_ARRAY(ar) (ar, ar + sizeof(ar) / sizeof(ar[0])
using std::vector;
...
static const int arr[] = {10,20,30};
vector<int> vec INIT_FROM_ARRAY(arr);
C++11 wird ebenfalls unterstützt std::begin und std::end für Array, also kann ein Vektor auch wie initialisiert werden static const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));.
– Jaege
17. Dezember 2016 um 4:57 Uhr
Peter Mortensen
Ich neige dazu, zu erklären
template< typename T, size_t N >
std::vector<T> makeVector( const T (&data)[N] )
{
return std::vector<T>(data, data+N);
}
irgendwo in einem Utility-Header und dann ist alles, was erforderlich ist:
C++11 wird ebenfalls unterstützt std::begin und std::end für Array, also kann ein Vektor auch wie initialisiert werden static const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));.
Wenn Sie die Größe von ints nach der Initialisierung nicht ändern möchten, sollten Sie die Verwendung des tr1-Arrays in Betracht ziehen.
– zr.
10. Februar 2010 um 11:21 Uhr
@zr, du hast mich neugierig gemacht … wenn ich eine feste Größe bräuchte, könnte ich dann nicht einfach alte Arrays selbst verwenden? Betrachte gerade das tr1-Array …
– Agnel Kurian
10. Februar 2010 um 11:53 Uhr
tr1::array
ist nützlich, da gewöhnliche Arrays nicht die Schnittstelle von STL-Containern bieten– Manuel
10. Februar 2010 um 12:21 Uhr
Der Titel wurde geändert, um dies explizit zu einer C++03-Frage zu machen. Es schien einfacher, als alle Antworten durchzugehen und zu korrigieren, damit sie mit dem neuen Standard C++ sinnvoll sind.
– TED
24. Februar 2014 um 16:12 Uhr
Das nennt man Listeninitialisierung.
– Alandawkins
11. August 2018 um 8:00 Uhr