Maison >développement back-end >C++ >Comment étendre efficacement un vecteur avec son propre contenu en C ?

Comment étendre efficacement un vecteur avec son propre contenu en C ?

DDD
DDDoriginal
2024-11-11 07:57:02395parcourir

How to Efficiently Extend a Vector with its Own Content in C  ?

Un moyen efficace d'étendre un vecteur avec son propre contenu

En C , le conteneur vectoriel est largement utilisé pour la gestion dynamique de la mémoire. Lorsqu'il s'agit d'ajouter le contenu d'un vecteur à lui-même, sans utiliser de boucle, les développeurs recherchent souvent une solution efficace.

Une approche consiste à utiliser la fonction std::copy. Cependant, comme mentionné dans la question, cela peut conduire à un défaut de segmentation. La raison en est que le simple fait de copier les éléments à la fin du vecteur existant chevauche la mémoire occupée par les éléments d'origine.

Une solution plus fiable utilise une combinaison de std::resize et std::copy_n. L'extrait de 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);

Cette approche fonctionne en augmentant d'abord la capacité du vecteur à l'aide de std::resize. Puisque std::resize réaffecte la mémoire si nécessaire, nous devons nous souvenir de la taille d'origine à l'aide de la variable old_count. L'opération std::copy_n suivante copie les éléments d'origine dans la mémoire nouvellement allouée, dupliquant ainsi le contenu du vecteur.

Une alternative à std::resize est std::reserve, qui alloue uniquement suffisamment de mémoire pour contenir le nombre spécifié d'éléments. Cependant, après avoir utilisé std::reserve, std::copy_n est toujours requis car l'itérateur de fin pointe un élément après la fin du vecteur, le rendant invalide pour l'insertion.

Il est important de noter que std::insert et std::push_back peut nécessiter une réallocation, ce qui peut invalider les itérateurs et références existants avant le point d'insertion. Par conséquent, dans le but d'ajouter un vecteur à lui-même sans utiliser de boucle, la combinaison de std::resize ou std::reserve et std::copy_n fournit une solution fiable et efficace.

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