Maison > développement back-end > C++ > Comment dupliquer efficacement un vecteur en C sans boucles ?

Comment dupliquer efficacement un vecteur en C sans boucles ?

Barbara Streisand
Libérer: 2024-11-08 16:47:01
original
198 Les gens l'ont consulté

How to Efficiently Duplicate a Vector in C   Without Loops?

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);
Copier après la connexion

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));
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal