Rückkehr stl-Container-Funktionen

Was ist der beste Weg (leistungsmäßig) von der Rückkehr stl-Containern von einer Funktion? Der container zurückgegeben würde enthalten in der Regel mehrere tausend Elemente.

Methode 1:

typedef std::list<Item> ItemContainer;

ItemContainer CreateManyItems() {
    ItemContainer result;

    //fill the 'result' ...

    return result;
}

ItemContainer a = CreateManyItems();

Methode 2:

void CreateManyItems(ItemContainer &output) {
    ItemContainer result;

    //fill the 'result' ...

    output.swap(result);
} 

ItemContainer a;
CreateManyItems(a);

Methode 3:

void std::auto_ptr<ItemContainer> CreateManyItems() {
    std::auto_ptr<ItemContainer> result(new ItemContainer);

    //fill the 'result' ...

    return result;
}

std::auto_ptr<ItemContainer> a = CreateManyItems();

Oder gibt es eine bessere Möglichkeit?

  • Performance-Weise ? Nicht mit einem list...
  • M.: die Liste ist nur ein Beispiel.
  • es ist ein Interessantes Beispiel obwohl. Der erste "Daten-Struktur" so zu sprechen, dass gelehrt wird, in Computer-Wissenschaft-Kurse sind Listen (einzeln-gebunden und doppelt-verlinkte), weil ein array nur so dumm, es nicht gewährleisten, zu erwähnen. Aber als Ergebnis sind die meisten Studenten "Standard" Wahl, wenn es um eine einfache container ist list, weil es das erste war, Sie waren gelehrt!
  • der zweite Punkt ist über die Kosten des move-Konstruktor. Für copy elision, alle Container Verhalten sich gleich. Für die move-Konstruktor obwohl, das ist nicht so, wie die Kosten der Bewegung proportional ist (mehr oder weniger) auf die sizeof(Container). Deshalb Behälter mit wenig interne Größe (list oder vector) zuordnen, die meisten von deren Inhalt auf dem heap sind Billig, ob eine dumme array würde vollständig kopiert Bewegen.
  • M. : Meine ersten C++ - container std::vector. Ich habe es standardmäßig für alles. Jetzt versuche ich Sie einen container verwenden, ich denke, am besten geeignet ist und einfach zu bedienen, in der gegebenen situation. Die Liste hat eine schöne Eigenschaft, die Iteratoren werden nicht dadurch entkräftet, einsetzen.
  • genau, das ist seine einzige Vorteil gegenüber anderen, aber es ist definitiv eine, die praktisch sein kann.

InformationsquelleAutor Juraj Blaho | 2011-05-13
Schreibe einen Kommentar