Was ist der einfachste Weg, einen std::vector mit fest codierten Elementen zu initialisieren?

Lesezeit: 7 Minuten

Was ist der einfachste Weg einen stdvector mit fest codierten
Agnel Kurian

Ich kann ein Array erstellen und es folgendermaßen initialisieren:

int a[] = {10, 20, 30};

Wie erstelle ich eine std::vector und gleich elegant initialisieren?

Der beste Weg, den ich kenne, ist:

std::vector<int> ints;

ints.push_back(10);
ints.push_back(20);
ints.push_back(30);

Gibt es einen besseren Weg?

  • 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

1647099012 145 Was ist der einfachste Weg einen stdvector mit fest codierten
Manuel

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


Was ist der einfachste Weg einen stdvector mit fest codierten
Yacoby

Eine Methode wäre, das Array zu verwenden, um den Vektor zu initialisieren

static const int arr[] = {16,2,77,29};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );

  • @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

1647099014 608 Was ist der einfachste Weg einen stdvector mit fest codierten
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.

    – Adam Erickson

    16. September 2018 um 20:55 Uhr

  • Leider ist dieser Ansatz in einigen Fällen problematisch, z open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1467. Yuck.

    – Leichtigkeitsrennen im Orbit

    27. Februar 2019 um 12:31 Uhr

  • 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

1647099015 228 Was ist der einfachste Weg einen stdvector mit fest codierten
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))

1647099016 805 Was ist der einfachste Weg einen stdvector mit fest codierten
mbells

In C++11:

#include <vector>
using std::vector;
...
vector<int> vec1 { 10, 20, 30 };
// or
vector<int> vec2 = { 10, 20, 30 };

Verwenden von Boost list_of:

#include <vector>
#include <boost/assign/list_of.hpp>
using std::vector;
...
vector<int> vec = boost::assign::list_of(10)(20)(30);

Verwenden von Boost-Zuweisung:

#include <vector>
#include <boost/assign/std/vector.hpp>
using std::vector;
...
vector<int> vec;
vec += 10, 20, 30;

Konventionelle STL:

#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

1647099017 380 Was ist der einfachste Weg einen stdvector mit fest codierten
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:

const double values[] = { 2.0, 1.0, 42.0, -7 };
std::vector<double> array = makeVector(values);

  • 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

1647099017 380 Was ist der einfachste Weg einen stdvector mit fest codierten
Peter Mortensen

Vor C++ 11:

Methode 1

vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
vector<int>v;

Methode 2

 v.push_back(SomeValue);

C++ 11 und darunter ist ebenfalls möglich

vector<int>v = {1, 3, 5, 7};

Das können wir auch

vector<int>v {1, 3, 5, 7}; // Notice .. no "=" sign

Ab C++ 17 können wir den Typ weglassen

vector v = {1, 3, 5, 7};

  • Funktioniert nicht für einen Vektor mit einem einzelnen Element.

    – ar2015

    1. August 2021 um 11:09 Uhr

994160cookie-checkWas ist der einfachste Weg, einen std::vector mit fest codierten Elementen zu initialisieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy