2009-01-19 5 views

Antwort

81

Warum sollten Sie iterieren und nicht den Standard-Kopieralgorithmus verwenden?

std::copy(vector.begin(), vector.end(), std::back_inserter(list)); 
+0

Sollte std :: copy anstelle von stl :: copy sein, aber ansonsten ist dies die bevorzugte Methode, wenn Iteratoren zum Kopieren verwendet werden. – workmad3

0

Sie können versuchen, heikler Dinge aus dem <algorithm> Header zu verwenden, zum Beispiel for_each oder copy ... aber sie würden auf dasselbe hinaus, meiner Meinung nach.

+0

for_each wird gleich sein. Die Kopie kann überladen werden, um in Abhängigkeit von den bereitgestellten Iteratoren eine viel effizientere Kopiermechanik bereitzustellen, und ist im Allgemeinen der bevorzugte Mechanismus. – workmad3

56

Wenn Sie eine neue Liste zu machen, können Sie die Vorteile von einem Konstruktor übernehmen, die Iteratoren beginnen und Ende nimmt:

std::list<SomeType> myList(v.begin(), v.end()); 

Kasprzol Antwort ist perfekt, wenn Sie eine bestehende Liste haben Sie anhängen möchten.

1

Ich mag diesen Vorschlag für den Aufbau einer neuen Liste.

Wenn Sie jedoch an eine vorhandene Liste anfügen, kann das Folgende für kleine Datensätze optimal sein. Mit "optimal" meine ich, dass es am einfachsten ist, sich daran zu erinnern, wie man es am besten versteht und am leichtesten versteht. (Dies sind subjektive Aussagen, ich bin sicher, es hängt davon ab, wie Ihr Gehirn verdrahtet ist.)

for (unsigned i=0; i<v.size(); i++) myList.push_back(v[i]); 

Iteratoren auf Vektoren können unter Verwendung von übermäßig pedantisch in vielen Fällen. Einfache Indexierung funktioniert normalerweise gut.

Ein anderer Thread Adressen Iteratoren vs. Indizes (here). In diesem Thread bevorzugte die genommene Antwort grundsätzlich Iteratoren, weil sie generischer sind. Aber wenn Vektoren der am häufigsten verwendete Containertyp sind, denke ich, dass es sinnvoll ist, diese Art von einfachem Algorithmus zu spezialisieren.

6
list.assign(vector.begin(), vector.end()); 
+0

Dies ist hilfreich, aber Sie sollten dieser Antwort möglicherweise einen Nicht-Code hinzufügen, um ein potenzielles VLQ-Flag zu vermeiden. –

Verwandte Themen