Ich habe ein lokales std::vector<std::reference_wrapper<T> > und möchte jetzt eine echte Kopie seiner Elemente zurückgeben (d. H. std::vector<T>). Gibt es einen besseren Weg als eine Schleife?

Beispiel:

std::vector<T> foobar() {
    std::vector<std::reference_wrapper<T> > refsToLocals;
    /*
      do smth with refsToLocals
    */
    std::vector<T> copyOfLocals;
    for (auto local : refsToLocals)
        copyOfLocals.insert_back(local.get());
    return copyOfLocals;
}
7
Dmytrii S. 26 Dez. 2015 im 03:06

2 Antworten

Beste Antwort

Es scheint, dass der offensichtliche Ansatz darin besteht, einfach ein std::vector<T> aus einer Sequenz aus dem std::vector<std::reference_wrapper<T>> zu konstruieren:

std::vector<T> foobar() {
    std::vector<std::reference_wrapper<T> > refsToLocals;
    /* do smth with refsToLocals */
    return std::vector<T>(refsToLocals.begin(), refsToLocals.end());
}
8
Dietmar Kühl 26 Dez. 2015 im 01:01

Sie können std::copy folgendermaßen verwenden:

std::copy(
    refsToLocals.begin(), 
    refsToLocals.end(), 
    std::back_inserter(copyOfLocals));

Stellen Sie sicher, dass Sie den Aufruf copyOfLocals.reserve(refsToLocals.size()) verwenden. Dadurch werden Kopien und Heap-Zuordnungen minimiert.

1
Curve25519 26 Dez. 2015 im 00:22