Création d'un doublon 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.
Approche du 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.
La solution optimale
La solution optimale implique en utilisant à 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 originale du vecteur 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 les 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 valides et aucune réallocation ne se produit si possible.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!