Maison >développement back-end >C++ >Comment dupliquer et ajouter efficacement un vecteur à lui-même ?

Comment dupliquer et ajouter efficacement un vecteur à lui-même ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-07 01:53:13755parcourir

How to Efficiently Duplicate and Append a Vector to Itself?

Auto-ajout efficace de vecteurs

Avez-vous rencontré le besoin de dupliquer et d'ajouter le contenu d'un vecteur à lui-même ? Si tel est le cas, vous recherchez peut-être une solution élégante sans recourir à des boucles explicites.

Bien que std::vector::insert puisse sembler être un candidat approprié, la version itérative présente un comportement non défini si elle est utilisée avec *this comme itérateur. De plus, std::copy seul peut entraîner des erreurs de segmentation.

N'ayez crainte ! Il existe une approche simple et efficace qui comporte deux étapes :

  1. Redimensionner : Étendre la capacité du vecteur pour accueillir les éléments dupliqués. Vous pouvez utiliser redimensionner ou réserver à cet effet.
  2. Copier : Utilisez std::copy_n pour transférer les éléments d'origine vers la partie nouvellement allouée du vecteur.

Voici un exemple d'utilisation du redimensionnement :

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 la réserve avec std::back_inserter:

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

Notez que lors de l'utilisation de la réserve, std::copy_n est essentiel puisque end() pointe vers la fin du vecteur, ce qui le rend invalide en tant que point d'insertion.

Les solutions ci-dessus garantissent que le vecteur résultant contient les éléments d'origine dupliqués et ajoutés à eux-mêmes, préservant l'intégrité des éléments existants et minimisant les opérations de réallocation.

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!

Déclaration:
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