"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment dupliquer efficacement un vecteur en C++ sans boucles ?

Comment dupliquer efficacement un vecteur en C++ sans boucles ?

Publié le 2024-12-22
Parcourir:820

How to Efficiently Duplicate a Vector in C   Without Loops?

Création d'une duplication de vecteur

Lors de l'ajout d'un vecteur à lui-même, il est souhaitable d'éviter d'utiliser des boucles pour des raisons de performances. La fonction std::vector::insert, bien qu'étant une option, ne permet pas d'utiliser un itérateur pour *this.

Aborder le problème avec std::copy

Utiliser std::copy pour résoudre ce problème peut sembler une solution, mais cette approche peut conduire à des erreurs de segmentation.

L'Optimal Solution

La solution optimale implique d'utiliser à la fois resize (ou réserver) et copy_n. Voici comment cela fonctionne :

auto old_count = xx.size();
xx.resize(2 * old_count);
std::copy_n(xx.begin(), old_count, xx.begin()   old_count);

Ce code stocke d'abord la taille du vecteur d'origine dans old_count. Ensuite, il redimensionne xx pour doubler sa capacité. Enfin, std::copy_n copie les éléments du début de xx à la fin de xx, dupliquant ainsi le vecteur.

Vous pouvez également utiliser reserve au lieu de resize :

auto old_count = xx.size();
xx.reserve(2 * old_count);
std::copy_n(xx.begin(), old_count, std::back_inserter(xx));

Lors de l'utilisation de reserve, copy_n est essentiel puisque l'itérateur end() pointe au-delà de la fin, le rendant invalide pour insertions.

Cette approche satisfait aux conditions décrites dans 23.3.6.5 [vector.modifiers], garantissant que les itérateurs et les références avant le point d'insertion restent valide et aucune réallocation ne se produit si possible.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3