Hier gab es viele Antworten, und fast alle werden die Arbeit erledigen.
Es gibt jedoch einige irreführende Ratschläge!
Hier sind die Optionen:
vector<int> dataVec;
int dataArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
unsigned dataArraySize = sizeof(dataArray) / sizeof(int);
// Method 1: Copy the array to the vector using back_inserter.
{
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 2: Same as 1 but pre-extend the vector by the size of the array using reserve
{
dataVec.reserve(dataVec.size() + dataArraySize);
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 3: Memcpy
{
dataVec.resize(dataVec.size() + dataArraySize);
memcpy(&dataVec[dataVec.size() - dataArraySize], &dataArray[0], dataArraySize * sizeof(int));
}
// Method 4: vector::insert
{
dataVec.insert(dataVec.end(), &dataArray[0], &dataArray[dataArraySize]);
}
// Method 5: vector + vector
{
vector<int> dataVec2(&dataArray[0], &dataArray[dataArraySize]);
dataVec.insert(dataVec.end(), dataVec2.begin(), dataVec2.end());
}
Um es kurz zu machen: Methode 4 mit vector :: insert ist das Beste für das Szenario von bsruth.
Hier sind einige wichtige Details:
Methode 1 ist wahrscheinlich am einfachsten zu verstehen. Kopieren Sie einfach jedes Element aus dem Array und schieben Sie es in die Rückseite des Vektors. Leider ist es langsam. Da es eine Schleife gibt (impliziert mit der Kopierfunktion), muss jedes Element einzeln behandelt werden. Aufgrund der Tatsache, dass wir wissen, dass das Array und die Vektoren zusammenhängende Blöcke sind, können keine Leistungsverbesserungen vorgenommen werden.
Methode 2 ist eine vorgeschlagene Leistungsverbesserung gegenüber Methode 1; Reservieren Sie einfach die Größe des Arrays vor dem Hinzufügen. Für großen Arrays dies könnte helfen. Der beste Rat hier ist jedoch, niemals Reserve zu verwenden, es sei denn, die Profilerstellung deutet darauf hin, dass Sie möglicherweise eine Verbesserung erzielen können (oder Sie müssen sicherstellen, dass Ihre Iteratoren nicht ungültig werden). Bjarne stimmt zu . Übrigens stellte ich fest, dass diese Methode die meiste Zeit am langsamsten lief, obwohl ich Schwierigkeiten habe, umfassend zu erklären, warum sie regelmäßig signifikant langsamer war als Methode 1 ...
Methode 3 ist die Lösung der alten Schule - werfen Sie etwas C auf das Problem! Funktioniert gut und schnell für POD-Typen. In diesem Fall muss die Größe geändert werden, da memcpy außerhalb der Grenzen des Vektors arbeitet und es keine Möglichkeit gibt, einem Vektor mitzuteilen, dass sich seine Größe geändert hat. Abgesehen davon, dass dies eine hässliche Lösung ist (Byte-Kopieren!), Denken Sie daran, dass dies nur für POD-Typen verwendet werden kann . Ich würde diese Lösung niemals verwenden.
Methode 4 ist der beste Weg. Die Bedeutung ist klar, es ist (normalerweise) die schnellste und es funktioniert für alle Objekte. Die Verwendung dieser Methode für diese Anwendung hat keinen Nachteil.
Methode 5 ist eine Optimierung von Methode 4 - kopieren Sie das Array in einen Vektor und hängen Sie es dann an. Gute Option - im Allgemeinen schnell und klar.
Schließlich wissen Sie, dass Sie Vektoren anstelle von Arrays verwenden können, oder? Selbst wenn eine Funktion Arrays im C-Stil erwartet, können Sie Vektoren verwenden:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
Hoffe das hilft jemandem da draußen!