Ich kann ein Array erstellen und wie folgt initialisieren:
int a[] = {10, 20, 30};
Wie erstelle ich ein std::vector
und initialisiere es ähnlich elegant?
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?
c++
vector
stl
initialization
Agnel Kurian
quelle
quelle
tr1::array
ist nützlich, weil gewöhnliche Arrays nicht die Schnittstelle von STL-Containern bietenAntworten:
Eine Methode wäre, das Array zum Initialisieren des Vektors zu verwenden
quelle
static
oderconst
, aber beide machen es expliziter, wie es verwendet werden soll, und ermöglichen dem Compiler, zusätzliche Optimierungen vorzunehmen.Wenn Ihr Compiler C ++ 11 unterstützt, können Sie einfach Folgendes tun:
Dies ist in GCC ab Version 4.4 verfügbar . Leider scheint VC ++ 2010 in dieser Hinsicht hinterherzuhinken.
Alternativ verwendet die Boost.Assign- Bibliothek Nicht- Makromagie , um Folgendes zu ermöglichen:
Oder:
Denken Sie jedoch daran, dass dies einen gewissen Overhead hat (im Grunde genommen wird
list_of
einstd::deque
unter der Haube erstellt), sodass Sie für leistungskritischen Code besser dran sind, wie Yacoby sagt.quelle
this->vect = {};
?std::vector<T> vector;
std::vector<int> v = {1, 2, 3, 4};
, werden Vektoreninitializer list constructor
für diese Art der Initialisierung aufgerufen. Das Dokument finden Sie imC++ 11
Abschnitt .Wenn Sie können, verwenden Sie das moderne C ++ [11,14,17, ...]:
Die alte Art, ein Array mit variabler Länge zu durchlaufen oder zu verwenden,
sizeof()
ist für die Augen wirklich schrecklich und in Bezug auf den mentalen Overhead völlig unnötig. Yuck.quelle
In C ++ 0x können Sie dies genauso tun wie mit einem Array, jedoch nicht im aktuellen Standard.
Mit nur Sprachunterstützung können Sie verwenden:
Wenn Sie andere Bibliotheken hinzufügen können, können Sie Boost :: Assignment ausprobieren:
So vermeiden Sie die Hardcodierung der Größe eines Arrays:
quelle
int another[size_of_array(array)]
können:, während Sie tun könnenint another[ARRAY_SIZE(array)]
.sizeof
Ausdruck benötigen, für den keine Definition erforderlich ist. Während Sie tatsächlich eine Definition bereitstellen können, würde die statische Zuweisung eines Arrays und die Rückgabe eines Verweises darauf erforderlich sein, um es richtig zu machen, und die nächste Frage wäre, was als Werte für das Array sinnvoll wäre. (Beachten Sie auch, dass dies ein Array pro Typ / Größe-Kombination der Instanziierungen der Funktion bedeutet!) Da dies keine sinnvolle Verwendung ist, würde ich es lieber vermeiden.In C ++ 11:
Verwenden von boost list_of:
Verwenden der Boost-Zuweisung:
Konventionelle STL:
Konventionelle STL mit generischen Makros:
Konventionelle STL mit einem Vektorinitialisierermakro:
quelle
std::begin
undstd::end
für Array, so dass ein Vektor auch wie initialisiert werden kannstatic const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));
.Ich dachte nur, ich würde meine $ 0,02 einwerfen. Ich neige dazu, dies zu erklären:
irgendwo in einem Utility-Header und dann ist alles, was benötigt wird:
Aber ich kann nicht auf C ++ 0x warten. Ich stecke fest, weil mein Code auch in Visual Studio kompiliert werden muss. Boo.
quelle
const T (&data)[N]
Teil erklären ? Wie wird die Größe des Arrays in Ihrem Anruf abgeleitetmakeVector(values)
?Vor C ++ 11:
Methode 1 =>
Methode 2 =>
Ab C ++ 11 ist ebenfalls möglich
quelle
Beginnen mit:
Wenn Sie keinen C ++ 11-Compiler haben und keinen Boost verwenden möchten:
Wenn Sie keinen C ++ 11-Compiler haben und Boost verwenden können:
Wenn Sie einen C ++ 11-Compiler haben:
quelle
Zur Vektorinitialisierung -
kann durchgeführt werden, wenn Sie einen C ++ 11-Compiler haben.
Andernfalls können Sie ein Array der Daten haben und dann eine for-Schleife verwenden.
Abgesehen von diesen gibt es verschiedene andere Möglichkeiten, die oben unter Verwendung von Code beschrieben wurden. Meiner Meinung nach sind diese Methoden leicht zu merken und schnell zu schreiben.
quelle
Der einfachste Weg ist:
quelle
Ich baue meine eigene Lösung mit
va_arg
. Diese Lösung ist C ++ 98-kompatibel.Demo
quelle
Wenn Ihr Compiler Variadic-Makros unterstützt (was für die meisten modernen Compiler gilt), können Sie das folgende Makro verwenden, um die Vektorinitialisierung in einen Einzeiler umzuwandeln :
Mit diesem Makro können Sie einen initialisierten Vektor mit folgendem Code definieren:
Dies würde einen neuen Ints-Vektor mit dem Namen my_vector mit den Elementen 1, 2, 3, 4 erstellen.
quelle
Wenn Sie Boost nicht verwenden möchten, aber Syntax wie genießen möchten
Fügen Sie einfach diesen Codeabschnitt hinzu
quelle
((((v+=1),2),3),4),5)
So funktioniert es: Zuerst wirdvector<T> += T
ein vector_inserter zurückgegeben,vi
der den ursprünglichen Vektor einkapselt, und dannvi,T
T zum ursprünglichen Vektor hinzugefügt, der ihnvi
einkapselt und selbst zurückgibt , damit wir esvi,T
erneut tun können.In C ++ 11:
quelle
vector<int> arr = {10, 20, 30};
.Sie können dies mit boost :: assign tun.
Detail hier
quelle
+=
dort anheften 1,2,3,4 .. bis zum Ende der Werte, oder tut es addieren 1 zum ersten Element, 2 mit dem zweiten Element, 3 mit dem dritten Element (wie Syntax wie diese sollten in Matlab wie Sprachen)Eine neuere doppelte Frage hat diese Antwort von Viktor Sehr . Für mich ist es kompakt, optisch ansprechend (es sieht so aus, als würden Sie die Werte "verschieben"), erfordert kein C ++ 11 oder ein Modul eines Drittanbieters und vermeidet die Verwendung einer zusätzlichen (geschriebenen) Variablen. Im Folgenden wird beschrieben, wie ich es mit einigen Änderungen verwende. Ich werde möglicherweise in Zukunft die Funktion von vector und / oder va_arg erweitern.
quelle
Die folgenden Methoden können verwendet werden, um den Vektor in c ++ zu initialisieren.
int arr[] = {1, 3, 5, 6}; vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
vector<int>v; v.push_back(1); v.push_back(2); v.push_back(3);
und so weitervector<int>v = {1, 3, 5, 7};
Der dritte ist nur ab C ++ 11 zulässig.
quelle
Hier gibt es viele gute Antworten, aber da ich vor dem Lesen selbstständig zu meinen eigenen Antworten gekommen bin, dachte ich mir, ich würde meine sowieso hier hochwerfen ...
Hier ist eine Methode, die ich dafür verwende und die universell über Compiler und Plattformen hinweg funktioniert:
Erstellen Sie eine Struktur oder Klasse als Container für Ihre Objektsammlung. Definieren Sie eine Operatorüberladungsfunktion für <<.
Sie können Funktionen erstellen, die Ihre Struktur als Parameter verwenden, z.
Dann können Sie diese Funktion folgendermaßen aufrufen:
Auf diese Weise können Sie eine Sammlung von Objekten mit dynamischer Größe erstellen und an eine Funktion in einer einzigen klaren Linie übergeben!
quelle
Wenn Sie etwas in derselben allgemeinen Reihenfolge wie Boost :: Assign möchten, ohne eine Abhängigkeit von Boost zu erstellen, ist Folgendes zumindest vage ähnlich:
Ich wünschte, die Syntax für die Verwendung wäre sauberer, aber es ist immer noch nicht besonders schrecklich:
quelle
So kompilieren Sie:
quelle
quelle
Wenn das Array ist:
quelle
Es ist sehr praktisch, beim Schreiben eines Tests einen Vektor inline zu erstellen, ohne eine Variable zu definieren, zum Beispiel:
quelle
Im Zusammenhang damit können Sie Folgendes verwenden, wenn Sie einen Vektor vollständig für eine schnelle Anweisung bereit haben möchten (z. B. sofort an eine andere Funktion übergeben):
Beispielfunktion
Beispiel verwenden
Seien Sie jedoch vorsichtig mit dem Dekltyp, stellen Sie jedoch sicher, dass der erste Wert genau Ihren Wünschen entspricht.
quelle
Es gibt verschiedene Möglichkeiten, einen Vektor fest zu codieren. Ich werde einige Möglichkeiten teilen:
quelle
"Wie erstelle ich einen STL-Vektor und initialisiere ihn wie oben beschrieben? Was ist der beste Weg, dies mit minimalem Schreibaufwand zu tun?"
Der einfachste Weg, einen Vektor zu initialisieren, während Sie Ihr integriertes Array initialisiert haben, ist die Verwendung einer Initialisierungsliste, die in C ++ 11 eingeführt wurde .
ivec ist 3 Elemente groß, nachdem Assigning (beschriftete Anweisung) ausgeführt wurde.
quelle
B. Stroustrup beschreibt in 16.2.10 Selfreference auf Seite 464 in der C ++ 11-Ausgabe des Prog eine gute Möglichkeit, Operationen zu verketten . Lang. Dabei gibt eine Funktion eine Referenz zurück, die hier in einen Vektor geändert wurde. Auf diese Weise können Sie verketten,
v.pb(1).pb(2).pb(3);
aber es kann zu viel Arbeit für solch kleine Gewinne sein.quelle
Der einfachste und ergonomischste Weg (mit C ++ 11 oder höher):
quelle
Falls Sie es in Ihrer eigenen Klasse haben möchten:
quelle