2015-12-26 20 views
7

Ich habe einen lokalen std::vector<std::reference_wrapper<T> > und jetzt will ich eine echte Kopie seiner Elemente zurückzukehren (d std::vector<T>). Gibt es einen besseren Weg als eine Schleife?Wie std :: vector <std :: reference_wrapper <T>> konvertieren std :: vector <T>

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; 
} 

Antwort

8

Es scheint, die offensichtliche Vorgehensweise ist nur ein std::vector<T> aus einer Sequenz Konstrukt aus den std::vector<std::reference_wrapper<T>>:

std::vector<T> foobar() { 
    std::vector<std::reference_wrapper<T> > refsToLocals; 
    /* do smth with refsToLocals */ 
    return std::vector<T>(refsToLocals.begin(), refsToLocals.end()); 
} 
1

könnten Sie std::copy auf diese Weise verwenden:

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

Seien Sie sicher, copyOfLocals.reserve(refsToLocals.size()) rufen zu verwenden. Es minimiert Kopien und Heap-Zuweisungen.

Verwandte Themen