Solution élégante pour ajouter un vecteur à lui-même
Dupliquer le contenu d'un vecteur et l'ajouter au vecteur d'origine est une opération courante. Cependant, mettre en œuvre cela efficacement sans boucle peut être difficile.
Discussion du défi
La question met en évidence les limites de std::vector::insert et std::copy pour cette tâche spécifique. std::vector::insert interdit l'utilisation d'un itérateur pour faire référence au vecteur actuel, et std::copy déclenche une erreur de segmentation lorsqu'il est utilisé dans ce contexte.
Solution optimale
La solution optimale consiste à combiner std::vector::resize (ou std::vector::reserve) avec std::copy_n. Le code suivant illustre cette approche :
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count);
Vous pouvez également utiliser std::vector::reserve et std::back_inserter:
auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
Explication
std::vector::resize réaffecte le vecteur si sa nouvelle taille dépasse son ancienne capacité. std::copy_n copie le nombre spécifié d'éléments depuis le début du vecteur vers un nouvel emplacement.
Lors de l'utilisation de std::vector::reserve, std::copy_n est nécessaire car l'itérateur end() pointe un élément après la fin du vecteur. Cela le rend invalide pour les insertions.
Conclusion
Cette solution offre un moyen concis et efficace d'ajouter le contenu d'un vecteur à lui-même sans recourir à une méthode basée sur une boucle. mise en œuvre. En utilisant les opérations resize et copy_n, vous pouvez obtenir la fonctionnalité souhaitée avec une surcharge de code minimale.
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!