Heim > Backend-Entwicklung > C++ > Wie listet man Vektoren mit Nur-Verschieben-Typen in C korrekt auf?

Wie listet man Vektoren mit Nur-Verschieben-Typen in C korrekt auf?

Barbara Streisand
Freigeben: 2025-01-01 07:20:10
Original
654 Leute haben es durchsucht

How to Correctly List-Initialize Vectors with Move-Only Types in C  ?

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());
Nach dem Login kopieren

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))
};
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage