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;
}
2 Antworten
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());
}
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.
Neue Fragen
c++
C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entwickelt und hat eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. Verwenden Sie ein versionsspezifisches Tag für Fragen zu einer bestimmten Standardversion [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] oder [C ++ 23] usw. .