initializer_list-Initialisierung von Vektoren mit Nur-Verschieben-Typen
In C, wenn versucht wird, einen Vektor mit Elementen einer Verschiebung in der Liste zu initialisieren -only-Typ wie std::unique_ptr versucht der Compiler möglicherweise fälschlicherweise, die Elemente zu kopieren, anstatt sie zu verschieben. Dieses Problem kann mit verschiedenen Techniken behoben werden:
Zwischen-Wrapper
Um Kopien zu vermeiden, kann ein Wrapper-Typ verwendet werden, um die Nur-Verschiebungswerte als Referenzen zu speichern. Die Klasse rref_wrapper demonstriert diesen Ansatz, indem sie die Nur-Verschiebung-Werte umschließt und einen Operator zum Extrahieren des zugrunde liegenden Werts bereitstellt. Dadurch können die Werte ohne Kopieren in den Vektor verschoben werden.
Beispiel:
std::initializer_list<rref_wrapper<std::unique_ptr<int>>> il{ rref(std::make_unique<int>()), rref(std::make_unique<int>()), rref(std::make_unique<int>()) }; std::vector<std::unique_ptr<int>> v(il.begin(), il.end());
std::make_move_iterator
Eine andere Methode besteht darin, std::make_move_iterator zu verwenden, um Iteratoren zu erstellen, die sich verschieben, wenn sie dereferenziert werden die Elemente, auf die verwiesen wird. Dadurch entfällt die Notwendigkeit einer Wrapper-Klasse.
Beispiel:
std::unique_ptr<int> init[] = { std::make_unique<int>(), std::make_unique<int>(), std::make_unique<int>() }; std::vector<std::unique_ptr<int>> v{ std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init)) };
Durch den Einsatz dieser Techniken wird es möglich, Vektoren mit Nur-Verschiebungs-Typen in Listen zu initialisieren , um eine effiziente und korrekte Eigentumsübertragung sicherzustellen.
Das obige ist der detaillierte Inhalt vonWie listet man Vektoren mit Nur-Verschieben-Typen in C korrekt auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!