Pointeurs dans des conteneurs. STL (partie 16)




Indices en conteneurs, STL, Programmation pour les débutants

conteneurs STL réduisent considérablement la complexité de l'écriture de code, travailler avec des structures de données dynamiques et, le plus important, augmenter son inerrance. Mais dans certains cas,, lorsque l'on travaille avec de grands éléments de données dans des conteneurs, Cette technique peut produire la perte inévitable de la productivité. voici, que, puisque l'opération chambre un élément conteneur, et à la suite déplacement éléments peuvent exiger une copie des éléments.

note: La gravité de ces effets dépend du type de récipient, et des transactions. par exemple, opération d'échange de 2 éléments dans le tri nécessitent 3 copyings conteneur de type vecteur et ne nécessitera pas de copie supplémentaire pour le récipient liste. Mais le fonctionnement de l'espace initial dans le récipient (repousser(), insérer() et al.) toujours faire une copie.

Cela peut être un problème pour une application, lorsque les opérations sur les conteneurs est essentiel pour l'exécution (ou vous sembler tels). Il y a même des cas plus compliqués, quand un objet conteneur de classe ne sont pas repris l'opération, ou lorsque les objets sont référencés objets eux-mêmes, sauvegardes complètes pour lequel vous souhaitez effectuer des procédures récursives suivantes tous les liens (la, en Python, et l'autre est appelé une copie profonde).

Tout fonctionne bien, comme avant - trier un ensemble d'enregistrements sur les champs arbitraires et dans un ordre quelconque:

16-1

(S'il vous plaît noter, que l'achèvement de cette application, vous avez besoin pour Ctrl + D - End Of File ... dans les veuves, sûrement, по Ctrl + Z.)

mais! ... Surtout débogage "traces" positifs ont été laissés constructeurs et destructeurs archives, et l'enregistrement construit 8 temps, et le destructeur ne se déclenche 4, pour tableau local au point du bloc de sortie. réseau local généralement pas d'intérêt pour nous. Il a été introduite pour simplifier l'exemple, que comme un ensemble de valeurs d'initialisation. Mais pour l'enregistrement, placé dans un conteneur, la destruction des documents ne se produit pas, et nous obtenons une fuite de mémoire franche. Mais le pire, après que nous enlevons l'élément du conteneur (sans prendre d'autres mesures), nous ne peut pas supprimer l'enregistrement, appelant à ce effacer. En effet,, après appel effacer() Nous avons perdu un record seulement chemin à travers l'itérateur (le code montre une boucle effacer(), de manière graphique, équivalent clair(), dont l'effet, Il est le même).

conclusion, qui peut être fabriqué à partir de l'exemple, regards:

  • de placer des objets dans des récipients non, et Indices ils, peut réduire considérablement le coût de calcul de la manipulation (mais toujours de principe si ces gains à la puissance de calcul actuelle?).

  • installations de remplacement des pointeurs dans des conteneurs rend le code est beaucoup plus dangereux dans le sens de bugs subtils cachés, Et un tel niveau sérieux, qui peut encore conduire à un blocage d'application.

Voici un peu d'aide peut avoir des pointeurs intelligents de la dernière norme C ++ (shared_ptr ou weak_ptr, mais unique_ptr et non le bon vieux et problématique auto_ptr), nous pour cela dans le code précédent, tout changement 4 ligne:

Dans Windows, shared_ptr nécessaire #comprendre <Mémoire> , et dans d'autres systèmes, mais pas nécessairement.

et demande un changement de comportement de manière significative:

16-2

Mais il ne faut pas se leurrer témérairement, pointeurs de manière intelligente, supprimer certains, générer d'autres problèmes potentiels (telles que les liaisons cycliques etc.. dont beaucoup est assez écrit).

Bulletin de nouvelles leçons sur la programmation:

date
page
Pointeurs dans des conteneurs. STL (partie 16)
évaluation
5
huile

Sur huile

une expérience pratique sur le développement de logiciels 40 ans. société de logiciels internationale Global Teacher Logic. IBM Developer Works auteur permanent des publications. éditeur scientifique de l'ordinateur littérature maison d'édition "Symbole-Plus", Saint-Pétersbourg.

Laisser un commentaire

Placez le code dans les balises: <pre class="lang:c ++ décodage:true ">VOTRE CODE</pré>