Was ist der einfachste Weg, um ein Array in einen Vektor umzuwandeln?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
Ich möchte x auf einfachste Weise vom int-Array in den Vektor konvertieren.
Verwenden Sie den vector
Konstruktor, der zwei Iteratoren akzeptiert, beachten Sie, dass Zeiger gültige Iteratoren sind, und verwenden Sie die implizite Konvertierung von Arrays in Zeiger:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);
oder
test(std::vector<int>(x, x + sizeof x / sizeof x[0]));
wo sizeof x / sizeof x[0]
ist offensichtlich 3
in diesem Zusammenhang; Dies ist die generische Methode, um die Anzahl der Elemente in einem Array zu ermitteln. Beachten Sie, dass x + sizeof x / sizeof x[0]
ein Element über das letzte Element hinaus zeigt.
vector<int> a(5,10);
Mittelwertmake room for 5
int bereits gelesen und mit 10 initialisiert. Aber wie funktioniert dein x, x + ...? können Sie erklären?vector<int>::vector(size_type, int)
, wird ausgewähltvector<int>::vector(int*, int*)
, wodurch der durch dieses Zeigerpaar angegebene Bereich kopiert wird. Die erste ist Überlastung (2), die zweite ist Überlastung (4) hiersizeof x / sizeof x[0] == std::extent<decltype(x)>::value
Persönlich gefällt mir der C ++ 2011-Ansatz sehr gut, da Sie weder
sizeof()
die Array-Grenzen verwenden noch daran denken müssen, sie anzupassen, wenn Sie jemals die Array-Grenzen ändern (und wenn Sie möchten, können Sie auch die entsprechende Funktion in C ++ 2003 definieren ):Natürlich möchten Sie mit C ++ 2011 möglicherweise trotzdem Initialisierungslisten verwenden:
quelle
std::vector<T>
besitzt immer dieT
Objekte. Dies hat zwei Auswirkungen: Wenn Objekte in einen Vektor eingefügt werden, werden sie kopiert und im Speicher zusammengefasst. Bei relativ kleinen Objekten, z. B. Sequenzen kurzer Zeichenfolgen, ist die Kollokation ein großer Leistungsgewinn. Wenn Ihre Objekte groß und teuer zu kopieren sind, möchten Sie möglicherweise [irgendwie ressourcenverwaltete] Zeiger auf die Objekte speichern. Welcher Ansatz effizienter ist, hängt von den Objekten ab, aber Sie haben die Wahl.Zeiger können wie alle anderen Iteratoren verwendet werden:
quelle
const size_t X_SIZE = 3;
Arraygröße angeben oder aus sizeof berechnen. Ich habe diesen Teil aus Gründen der Lesbarkeit weggelassen.Sie stellen hier die falsche Frage - anstatt alles in einen Vektor zu zwingen, fragen Sie, wie Sie den Test konvertieren können, um mit Iteratoren anstelle eines bestimmten Containers zu arbeiten. Sie können auch eine Überladung bereitstellen, um die Kompatibilität zu gewährleisten (und gleichzeitig andere Container kostenlos zu handhaben):
wird:
Was Sie tun können:
( Ideone-Demo )
quelle
Ein einfacher Weg kann die Verwendung einer
assign()
Funktion sein, die in vordefiniert istvector
Klasse .z.B
quelle