2013-05-15 7 views
5

Ich habe ein Array im C-Stil, und ich möchte es einem QVector zuweisen. Wenn ich std :: vector verwendet haben, würde ich assign() verwendet haben:std :: vector :: äquivalent für QVector zuweisen

int arr[] = { 1, 2, 3, 4, 5 }; 
std::vector<int> v; 
v.assign(arr, arr + sizeof(arr)/sizeof(int)); 

Aber für QVector konnte ich nicht ein ähnliches assign() Verfahren oder über Bereich annehme Konstruktor finden.

Ich habe bereits eine for-Schleife dafür programmiert, aber ich war überrascht, dass es keine so grundlegende Funktion gab, ist das wirklich so, oder gibt es eine Entsprechung?

+0

Nur als eine Randnotiz, würde ich in Ihrem Beispiel nicht einmal "zuweisen", sondern "Vektor" verwenden. –

Antwort

5

können Sie Qt verwenden qCopy():

int arr[] = { 1, 2, 3, 4, 5 }; 
QVector<int> v(5); 
qCopy(arr, arr+5, v.begin()); 

Oder Sie können std::copy() natürlich nutzen.

int arr[] = { 1, 2, 3, 4, 5 }; 
QVector<int> v(5); 
std::copy_n(&arr, 5, v.begin()); 
// or more general: 
QVector<int> v2; 
std::copy(std::begin(arr), std::end(arr), std::back_inserter(v2)); 
// without begin/end 
std::copy(arr, arr + 5, std::back_inserter(v2)); 
+0

@pmr Schön, viel slicker. – cmannett85

+2

Dies hat nicht den gleichen Effekt. Es drückt neue Elemente auf der Rückseite. Es funktioniert nur, wenn der QVector zu Beginn leer ist. – juanchopanza

+0

@juanchopanza Es hat die gleiche Wirkung wie der 'vector'-basierte Code, den das OP repliziert, obwohl Sie im Prinzip recht haben. – cmannett85

1

Es gibt fromStdVector(), die Ihnen eine QVector von einem std::vector erstellen können:

int arr[] = { 1, 2, 3, 4, 5 }; 
std::vector<int> v; 
v.assign(arr, arr + sizeof(arr)/sizeof(arr[0])); 
QVector<int> qvec = QVector<int>::fromStdVector(v); 
+0

Ich denke nicht, dass das ist was OP will. Er möchte das C-artige Array dem 'QVector' zuweisen. Er möchte keinen "Vektor" einem "QVector" zuordnen. – pmr

+0

Das einzige Problem ist, dass wir ein temporäres Objekt (d. H. Leistung) erstellen und zerstören. – sashoalm

+0

@pmr Obwohl das Konvertieren des Arrays in einen 'std :: vector' durch eine Umwandlung von' std :: vector' in 'QVector' erfolgen könnte, stimme ich zu, dass dies wahrscheinlich einer einfachen' std :: copy' unterlegen ist (besonders in Bezug auf die Leistung). Aber auf diese Weise könnten Sie es in nur einer einzigen Initialisierungszeile machen, statt der Initialisierung gefolgt von dem Kopieren (natürlich nur, wenn Sie diese ganze "Zuordnungs" -Madness für einen richtig initialisierten temporären "std :: vector" fallen lassen). –

-2

für einfache Typen (zB int, char, void * ... usw.), können Sie die Vorteile :: memcpy

int arr[] = { 1, 2, 3, 4, 5 }; 

const int CNT = sizeof(arr)/sizeof(int); 
QVector<int> v(CNT); 

// memcpy may be faster than std::copy_n in some compiler 
::memcpy(v.data(), arr, CNT * sizeof(int)); 

für Objekte (zB std :: string) erfolgen kann, eine Schleife schreiben, um die Objekte von Ank bis V

dann rufen nur die Kopie-Konstruktoren one-by-one

zB kopieren

std::string arr[] = { std::string("a"), std::string("b"), std::string("c") }; 
const int CNT = sizeof(arr)/sizeof(std::string); 
QVector<std::string> v(CNT); 
for(size_t i = 0; i < CNT ; ++i) 
    v[i] = arr[i]; 

Als Copykonstruktor für jedes Objekt in arr one-by-one aufgerufen werden muss, ich bin sicher, dass es nicht eine schnellere Lösung sein wird (auch verwenden Sie die std :: copy()).

Und der obige Code kann kleinere Code-Größe im Vergleich zu std :: copy in einigen Compilern ergeben.

+0

memcpy würde jedoch nicht für einen Vektor von std :: strings funktionieren. Dieser Code könnte zu möglichen Fehlern führen. – sashoalm

+3

Das ist ein Greuel. – pmr

+1

* Verwenden Sie nie etwas wie memset in einer C++ - Containerklasse. Tu es einfach nicht. –