Maison >développement back-end >C++ >Comment étendre efficacement un vecteur avec son propre contenu en 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!