Archives de la catégorie: Bibliothèques C ++

Travailler avec des chaînes localisées




premier, vous devez être en mesure de le faire avec les chaînes localisées - un caractère enregistrement constantes large caractères localisés et de les distinguer des lignes conventionnelles carboniser[]. Pour cette ligne est écrit Éliminatoires de la L avant:

Le résultat sera:

Faites attention, la longueur de chaîne (nombre caractères) dans ce cas, nettement moins, que le nombre octet alloué à la chaîne (votre système d'exploitation, leur attitude peut être différente de, Je montre sous Linux, mais il ne modifie pas la technique de programmation).

Dans une telle ligne près de avec un égal succès peuvent être des symboles de la diversité: langues différentes, symboles mathématiques spéciaux, commun le leurke désignation de l'alphabet grec (un, e, Je, Fr., p, l, fa, Oh ...), notes de musique, etc.. Comment avez-vous, évidemment, savoir, tout aussi bien comme une partie de chaînes de caractères larges, avec un égal succès, et peut répondre aux caractères de l'alphabet latin (ASCII table principale), avec chaque symbole tiendra également 2 ou 4 octet (selon les accords adoptés dans le système d'exploitation), contrairement à l'habitude 1 octet.

Nous effectuons un certain nombre d'opérations avec les lignes russes, mais en les (tandis que) sous forme traditionnelle tableaux carboniser:

effectuer:

il semblerait, que (presque) tout fonctionne précisément un manuel, et pourquoi nous avons besoin d'importantes chaînes localisées? mais il est trompeur illusion! Le point ici est, que certains fonctions traditionnelles en minuscules (strcat(), strcpy(), strdup(), strstr() et al.) renverra les résultats corrects. En effet, ils effectuent des opérations sur les octets, octet par octet, sans entrer dans la structure interne de caractères à copier.

Mais d'autres opérations (et faux résultat strlen() il a clairement points) ne fonctionnera pas correctement: strncpy(), strchr(), strsep(), strtok() et al. et ils vous créer un des résultats très inattendus, très difficile à interpréter. Regardezils comment fonctionne la chaîne octet inverse, et comment distinguer son travail sur les Anglais et ligne russe:

Il fonctionne si, et sans aucun doute pas, ce que vous vous attendiez à recevoir:

net cela conclut notre discussion sur la possibilité de représenter les lignes de tableaux traditionnels russophones carboniser[] et le traitement de leurs fonctions traditionnelles en minuscules, et complète cet examen sortie: py gagner avec des lignes russes en tant que tableau carboniser boîte seulement:

et). ou lorsque l'on utilise des constantes de chaîne inchangées, seulement comme une ligne pour leur entrée-sortie inchangé;

b). ou pour le traitement de leurs fonctions (bibliothèque ou leur propre), qui ne tiennent pas compte de la structure interne des caractères, sans entrer dans la est contenuil est temps, et opérer avec eux simplement comme une séquence d'octets sans signification.

en tout sinon correctJe travailler avec l'alphabet cyrillique disponible seulement comme un large éventail de caractères localisés wchar_t (avec l'achèvementm ligne large symbole nul L » 0′). Pour une représentation localisée des lignes de la bibliothèque C fournit large un ensemble de caractéristiques ligne, tout à fait semblable aux fonctions traditionnelles de minuscules, mais au lieu du préfixe str en leur nom préfixé par WCS: wcslen() au lieu de strlen(), wcsncpy() au lieu de strncpy() etc.

Voyons voir comment cela fonctionne sur l'exemple de:

Cette illustration est assez, pour voir les fonctions de manipulation directe des analogies avec des symboles wchar_t. la, qui a une certaine expérience de travail avec des chaînes carboniser sans effort Etalez larges cordes. locale Réglage de la langue (appel setlocale()) dispositifs O (terminal) - obligatoire, parce que le programme C / C ++ définit les paramètres régionaux par défaut “C” (età historiquement), ce qui permet la sortie seulement 128 caractères moins la moitié des caractères ASCII 8 bits.

Dans l'écriture illustré fonction définit les paramètres régionaux, utilisé dans le système d'exploitation par défaut - Je devine, que nous expérimentons dans le russophones le système installé. La nouvelle norme linguistique (C99) et introduit un nouveau format pour les fonctions de mise en forme de chaîne (printf(), sprintf()) - %ls, Cette chaînes de format wchar_t[].

Ten interne comme, Comme dans le cas des réseaux carboniser, convertit en C ++ de C, La bibliothèque C de introduit un analogue complet de la classe conteneur chaîne, mais contenant dans leur composition large des caractères localisés, et est connu sous le nom de la classe wstring:

Ici, la chaîne de sortie de caractères localisés (ws) il faut est émis vers le flux de sortie wcout (sens similaire cout, mais autre que cout).

Dans l'écriture illustré: lieu::global( lieu( “” ) ) - Ce paramètre de paramètres régionaux par défaut dans la manière OOP C de, semblable à, comme il a été démontré auparavant dans le mode de C.

lasondages IO chaînes de caractères large (à la borne ou à un fichier) séparée compliquée sujet, par conséquent un examen sera reporté à une seule note à ce sujet.

Bulletin de nouvelles leçons sur la programmation:

Utilisation des fichiers dans C ++. partie 2 – Библиотека fstream.




classe ofstream

retour classe ifstream, que nous avons examiné plus tôt, et est conçu pour écrire dans un fichier.

Comme dans ifstream, d'ouvrir ou de créer un fichier en utilisant un constructeur ou une méthode ouvrir().

ou le concepteur:

paramètre ios_base::app indiqué, si vous voulez ajouter à la fin d'un fichier existant. Par exemple, lorsque le programme tient un journal de leur travail

Pour la vérification d'un fichier ouvert rencontre tous les mêmes est ouvert()

Le principe est le même. Vous pouvez vérifier si un fichier est ouvert, en utilisant dans expression logique fichier très variables:

opérateur <<

Attaquants la sortie formatée dans un fichier. Le principe est le même, celle de l'analogue dans iostream.

Il est destiné à être affiché dans des fichiers texte. opérations de formatage contrôlées telles que largeur() ou setf(). Leurs homologues sont entièrement méthodes du même nom iostream.

La séquence de variables de sortie, comme indiqué à gauche à droite: La première variable sera sortie, liste le plus proche filet, il suit.

opérateur endl

De même, l'opérateur iostream fabrique dossier de transfert du chariot à une nouvelle ligne dans un fichier texte.

procédé d'écriture

Il est utilisé dans les fichiers binaires pour écrire le bloc de mémoire (tableau d'octets) dans le fichier comme ils sont. Toute variable est également tableau octet, plutôt elle peut être considérée comme. En conséquence, cette méthode écrit dans le fichier de la représentation de la machine (le genre de la façon dont il regarde dans la mémoire).

Cette méthode prend deux paramètres: Pointeur vers un bloc de données et le nombre d'octets, que cet appareil prend. Dans l'exemple, la chaîne prend strlen() octet, tout taille de() (qui donnera 4 entier de 32 bits et pour les systèmes d'exploitation 8 pour de vrai).

Encore une fois, je tiens à souligner la, que, contrairement à l'opérateur de sortie formaté <<, méthode écrire() Il ne présente pas les données sous forme de texte.

fermer cette méthode

Ferme méthode de fichier Fermer(). pour les fichiers, inscriptible, par opposition à la lecture de fichiers, la fermeture d'un fichier – rituel obligatoire. fichier non fermé ne peut pas obtenir les données. Cet effet peut se produire en raison de la mise en mémoire tampon lui-même OSes, lorsque les données, déversées dans le fichier, Ils sont stockés en fait à l'esprit et ne viennent pas à un fichier. Le système d'exploitation lui-même décide, lorsque les données est temps de fusionner.

une telle “différée” prunes appelé “engager” (du latin commit). Soit dit en passant cet effet très bien utiliser un système de gestion de base de données, où insérer des enregistrements tombent dans la mémoire de stockage (appelé transaction). Ce fut seulement après une commande spéciale en masse écrite dans le fichier de base de données elle-même. méthode Fermer() juste un exemple d'une équipe de clôture d'une transaction avec le fichier.

Il convient de mentionner juste au cas où, que si vous voulez engager à produire des données sans fermer le fichier lui-même, vous devez utiliser la méthode chasse d'eau()

Ces dépôts iront au dossier dans le fichier, mais il sera toujours ouvert pour les entrées. Cette méthode est souvent utilisée, mais utile de savoir à ce sujet.

Modes de mise en forme de largeur, précision

comme dans iostream, pour la belle mise en page des données dans le fichier de mise en forme de données peuvent être utilisées pour afficher l'opérateur << .

largeur() indique la largeur en caractères, qui sera mis à la valeur affichée, et précision() le nombre de chiffres de la partie décimale d'un réel. L'exemple le plus simple: table de sortie à un fichier texte les valeurs des fonctions trigonométriques:

 

méthodes de positionnement seekp, tellp

Pour déplacer un fichier comme dans le cas de ifstream Il y a une fonction de la position de la permutation. il est appelé seekp() et reçoit les mêmes paramètres que ceux décrits ci-dessus pour seekg().

Pour obtenir la position actuelle d'une fonction similaire en octets depuis le début du fichier tellp().

Vidéos sur le travail avec les fichiers en C ++:

Bulletin de nouvelles leçons sur la programmation:

Utilisation des fichiers dans C ++. partie 1 – Библиотека fstream.




tête fstream Il fournit la fonctionnalité de lecture des données à partir d'un fichier et écrire dans le fichier. En général, il est très similaire à l'en-tête iostream, qui travaille avec la console, parce que la console est également un fichier. Par conséquent, toutes les opérations de base sont les mêmes, pour les petites différences, comme dans le sujet précédent sur iostream.

Les opérations les plus fréquentes suivantes:

  1. Redirection Opérateurs O – << et >>
  2. Méthodes de lignes d'enregistrement et de lecture getline() et obtenir() c mettre()
  3. Streaming méthodes de lecture et d'écriture écrire() et lis()
  4. Méthode publique création et la fermeture de fichiers ouvrir() et Fermer()
  5. Les méthodes de vérification si le fichier est ouvert est ouvert() et si la fin de fichier est atteinte eof()
  6. Réglage de la sortie formatée pour >> par largeur() et précision()
  7. opération de positionnement tellg(), tellp() et seekg(), seekp()

Ce n'est pas toutes les possibilités, qui fournit la bibliothèque fstream. Tenez compte de tous maintenant, nous ne sommes pas, puisque leur champ d'application est assez étroite. Connaisseur ci-dessus. Commencez par lire la classe.

classe ifstream

Il offre la possibilité de lire les fichiers. Ouvrez le fichier de deux façons: méthode d'appel ouvrir() ou en entrant le chemin d'accès dans le constructeur. Vous devez préparer un fichier texte, avant, commencez à taper le code. Sur le disque d, créez un dossier nommé 1 et, créez un fichier avec l'extension txt – “файл.txt”.

Ouverture d'un fichier dans le constructeur ressemble à ceci:

Nous demandons donc d'ouvrir un fichier nommé fichier.txt txt, qui est dans le dossier avec le nom 1, et le dossier se trouve sur le lecteur d.

Utilisation de la méthode ouverte() confortablement, si le programmeur ne veut pas être lié directement à un fichier. Tout à coup, vous avez besoin d'une propriété de classe ou variable globale, bien, puis ouvrez le fichier déjà. Si vous avez besoin d'ouvrir un fichier dans une certaine fonction, de travailler avec lui et de fermer, vous pouvez définir le chemin vers le fichier directement dans le constructeur. En général, en fonction de la situation.

d'ouverture du fichier, souhaitable de prescrire par: s'il a ouvert? Comme il y a un certain nombre de raisons, sur lequel le fichier ne peut pas être ouvert, et nous ne voyons pas. par exemple, fichier avec le nom spécifié n'est pas dans le dossier ou le chemin prescrit n'est pas valide. Vous pouvez aller de deux façons: vérifier le fichier dans une variable expression logique (application de l'opérateur “!”, par exemple) ou d'utiliser la méthode est ouvert() :

Donc, tout va bien fonctionner et que le fichier sera ouvert:

библиотека fstream, travailler avec des fichiers en c ++, Programmation pour les débutantsMaintenant, essayez de saisir le nom du dossier n'est pas 1, et 2 ifstream fichier ("ré:\\<span style ="Couleur: #FF0000;"><fort>2</fort>\\файл.txt”); et redémarrez le programme. Étant donné que le nom du dossier spécifié, nous n'avons pas créé, le fichier, naturellement, Il ne peut pas être ouvert:

библиотека fstream, travailler avec des fichiers en c ++, Programmation pour les débutants

Les contrôles de second mode de réalisation utilisant le procédé est ouvert() :

méthode est ouvert() retour 1, Si le fichier est trouvé et ouvert avec succès. sinon retourne 0 et le code de travail prescrit dans le bloc autre.

Si le fichier est pas ouvert – souhaitable de gérer l'erreur. généralement, si tous le programme de travail associé au fichier, ils écrivent un certain message à la console, et de mettre sur le programme. Lorsque des erreurs graves communes pour revenir à une exécution de code (nombre), qui caractérisera une ou l'autre erreur. Les codes pour chaque type d'erreur l'auteur du programme peut inventer leur propre. L'une des façons de gérer les erreurs dans le programme, nous avons pris en compte dans l'article Exceptions en C ++.

Si le fichier est ouvert avec succès, de celui-ci, vous pouvez lire.

lire l'opérateur >>

Ainsi que dans iostream La lecture peut être organisé par l'opérateur >>, qui indique dans quelle variable sera à lire:

considère réel, chaîne et nombre entier. rangée fin de lecture, s'il y avait un espace ou à la fin de la ligne. Il est à noter, que l'opérateur >> Il a appliqué des fichiers texte. La lecture d'un fichier binaire pour faire le meilleur moyen de la méthode lis().

Soit dit en passant, cette déclaration est tout à fait pratique, si la tâche est de diviser le fichier en mots:

méthodes getline() и obtenir()

La lecture de la chaîne de caractères à la translation du chariot est fait le même que dans iostream par getline(). De plus, il est recommandé d'utiliser la version surchargée de la fonction, si vous lisez une ligne de type chaîne:

Si vous avez besoin de lire dans un tableau de caractères ombles[], non plus obtenir() ou getline() tout comme les méthodes:

Le principe est généralement le même, comme dans les analogues de iostream: Présentée comme une mémoire tampon de paramètres (variable, où la lecture se fera), ou plutôt un pointeur vers un bloc de mémoire (si la variable est déclarée statique: tampon de carbonisation[255] par exemple, il est écrit dans les paramètres &tampon), spécifie le nombre maximal de lisible (dans cet exemple n), afin de ne pas déborder est produit et la sortie des limites de la mémoire tampon et le caractère de séparation selon les besoins, à qui Relecture (Dans cet exemple, l'écart). J'espère que je ne l'ai pas mal sur la bande de roulement des fanatiques du tronc C, si la suie que ces deux fonctions sur 99% interchangeable, et 95% Ils peuvent être remplacés par lis().

méthode lis()

Comme dans l'exemple précédent?

En fait, ici le même résultat – Il est considéré comme un certain nombre de caractères. La seule exception, il est impossible de spécifier le séparateur. lis() utilisé pour l'entrée non formaté. Il est principalement destiné à lire les fichiers binaires. Étant donné que le fichier texte – un cas particulier d'un binaire, cette méthode est tout à fait applicable au fichier texte.

méthode Fermer()

ferme le fichier. Même rien à ajouter. Peut-être la seule remarque – sur, que le fichier, ouvert pour la lecture, ne sera pas fermé par cette méthode habituellement ne devienne pas pire. Situation très rare, lorsqu'il est ouvert pour la lecture se détériore fichier, si vous avez terminé le programme sans fermer le fichier. Ces dommages sont associés principalement avec des appareils non standard tels que les lecteurs de bande bande ou ce que certains flux de artificieux contrôleurs industriels, mais dans le Feng Shui de se rappeler – fichier ouvert doit être fermé. Il est considéré comme une bonne forme.

méthode eof()

Vérifie si la fin de fichier est atteinte. à savoir. s'il est possible de lui pour lire la suite. L'exemple ci-dessus de l'opérateur de mot de correction d'épreuves >> il suffit d'utiliser ce contrôle.

méthode seekg()

Installer la position actuelle à la souhaitée, indique le nombre. Cette méthode est également transmise méthode de positionnement:

  • ios_base::fin – Relevez un nouveau poste à la fin du fichier
  • ios_base::mendier – Relevez un nouveau poste depuis le début du fichier (positionnement absolu)
  • ios_base::cabot – Aller à n octets de la position actuelle dans le fichier (par défaut)

méthode tellg()

Parfois, vous avez besoin d'obtenir des informations sur, comme déjà lu. Cette méthode aidera tellg():

Il retourne une valeur de type int, ce qui montre combien a déjà passé en octets. Il peut être utilisé en tandem avec la méthode seekg(), Pour obtenir la taille du fichier:

À titre d'exemple des méthodes de lecture binaires peuvent être démantelées si classe:

classes d'emballage similaires utiles, s'il y a des problèmes de lecture à partir d'une structure entière binaire.

Vidéos sur le travail avec les fichiers en C ++:

Bulletin de nouvelles leçons sur la programmation:

sqrt() - Bibliothèque de fonctions cmath




sqrt( valeur );

La fonction sqrt() bibliothèque cmath (math.h) Il prend le paramètre de valeur et renvoie la racine carrée.

Si le ( dans ce cas – valeur) négatif, une erreur.

Le résultat est présenté dans la course compilateur en ligne ideone

exemple de la fonction sqrt C ++

Bulletin de nouvelles leçons sur la programmation:

bang() - Bibliothèque de fonctions cmath




bang(une, b);

Функция pow() bibliothèque cmath prend deux paramètres: une, b. Le premier numéro est (de base) élevé à la puissance b.

Renvoie la valeur d'uneb .

résultat de l'exécution 23 , 53, 52 :

bang () - bibliothèque de fonctions cmath

 

Bulletin de nouvelles leçons sur la programmation:

fma () – bibliothèque de fonctions cmath




fma(une, b, c);

Функция FMA() bibliothèque cmath accepte trois paramètres: une, b – multiplier les valeurs de, c – valeur à ajouter.

Renvoie la valeur d'une * b + c.

résultat de l'exécution ( 2 * 2 + 3):

fma () - bibliothèque de fonctions cmath

Bulletin de nouvelles leçons sur la programmation:

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:

Adaptateurs. STL (partie 15)




empiler, programmation pour les débutants

Une catégorie distincte de bibliothèque de modèle standard sont adaptateurs. Adaptateurs - ce n'est pas un nouveau concept ou la mise en œuvre, et l'adaptation des concepts existants bibliothèque pour spécifique, cible couramment utilisé. Souvent, cela se fait à travers l'adaptation restrictions la fonctionnalité des concepts de base pour les demandes d'adaptation. La bibliothèque présente l'adaptateur de récipient, itérateurs et fonctions.

La meilleure façon de montrer, apparaissent tous deux adaptateurs exemple adaptateurs conteneurs: empiler (cheminée), queue (tour), priority_queue (file d'attente prioritaire). Déjà il est clair à partir de leurs listes, que:

  • Il est largement et couramment utilisé des structures de données;

  • Ils ne nécessitent pas de mise en œuvre séparée. Pour assurer leur fonctionnalité peut être utilisée (adapter) en tant que base tout à partir de conteneurs standard STL, qui fournit des opérations telles que repousser, pop_arrière ou pop_front (en fonction du type d'adaptateur);

  • L'opération «extra» dans l'arsenal du conteneur de base devrait être exclue adaptateur (de ne pas créer de telles tentations ..., réindexation, si le vecteur est utilisé pour adapter la pile);

et, au lieu de définitions de syntaxe de modèle encombrants (fichiers d'en-tête <empiler>, <queue> et t. n.), Reportez-vous à l'exemple…

Commençons par la pile: caractérisé en pile, que l'accès à ses éléments ne peut être que d'un bout, appelé le sommet de la pile. Ceci est une collection de données, fonctionnant sur le principe de LIFO (Dernier entré, premier sorti). Voici un exemple simple révèle peu tous fonctionnalité de la pile:

Laissez-nous analyser le code et faire quelques conclusions:

  • première définition empiler<chaîne> (nous ne l'utilisons pas sur) déclare une pile de variable, dont les éléments sont des chaînes. S'il vous plaît noter, que objets chaîne sont eux-mêmes conteneurs STL. ainsi, pile peut contenir des éléments de tous les contenants de nidification (qui est caractéristique de, et tous les autres conteneurs STL).

  • cette définition ( empiler<chaîne> ) vous pouvez voir, une description de la pile dans la plupart des exemples. Beaucoup d'auteurs ne sont pas conscients, qui peut être différent. Mais nous allons utiliser une définition différente: empiler< chaîne, vecteur<chaîne> > - Une pile de chaînes (largement équivalente à la précédente), mais construit sur le vecteur de classe de base<chaîne>. En tant que base peut être utilisée, par exemple, vecteur, liste et et, ou même votre propre classe de conteneur, base croissante. par défaut (depuis le 1er déterminant) base de deque utilisé. Parfois, les gens demandent: pourquoi ne pas écrire (définis comme dans la mise en oeuvre de la pile): empiler< vecteur<chaîne> > (suppression de dupliquer la chaîne)? parce que (et il est tout à fait possible) Cette description est un type tout à fait différent: cheminée vecteurs temps (voir. ci-dessus remarque sur les conteneurs structurels de nidification).

  • suit initialisation vecteur d'état initial de chaînes. marque, qu'une telle astuce est valable uniquement en 11 standard C.

  • Ensuite, nous voyons presque tous opérations (méthodes), nécessaire de la pile: pousser() – poussant d'un objet sur la pile, sommet() – l'obtention d'une référence à un élément dans la partie supérieure de la pile, pop() – l'éjection de l'élément supérieur, Taille() – la taille actuelle de la pile, vide() – sur le chèque annulé.

  • Il est facile de comprendre, adaptateur pile perdu inhérente base Modes de conteneur (à(), [ ] et al.), mais acquise (redéfinition) leur propre (pousser(), pop()).

Maintenant, nous allons voir ce qui en est sorti:

empiler, programmation pour les débutants

Après avoir traité avec une pile de élémentaire Maintenant il suffit de déplacer l'analogie à tous. Contrairement à la pile – est un ensemble de données, fonctionnant selon le principe FIFO (Premier entré, premier sorti). (Il est un "pipe", une extrémité de laquelle coule quelque chose, puis à partir de l'autre extrémité suit.)

Un congé spécial par exemple, la file d'attente est presque inchangée, les modifications à apporter, sémantique du langage requis:

De nous, le changement demandé:

  • La ligne ne peut pas être construite sur le conteneur de vecteur de base qui n'a pas une méthode pop_front(), mais peut être basée sur la liste, et, ou tout autre récipient, met en œuvre un ensemble de base des méthodes (avant(), repousser(), pop_front()), par défaut et.

  • Il n'y a pas top méthode de l'adaptateur de file d'attente(), et une méthode similaire avant l'importation().

Et par conséquent, nous obtenons (comparer les résultats pour la pile!):

empiler, programmation pour les débutants

Bulletin de nouvelles leçons sur la programmation:

algorithmes numériques Généralisées. STL (partie 14)




Generalized algorithmes numériques STL c ++la prochaine, groupe très nécessaire et très puissant алгоритмов STL sont généralisées algorithmes numériques (tête <numérique>). Ce n'est pas une sorte de méthodes de calcul spéciales, que l'on pourrait penser en fonction du nom. Il algorithmes, permettre d'utiliser la bibliothèque bien connue ou de leurs propres activités informatiques à la totalité des éléments de conteneur. Et parce que, puis ils sont appelés comme tous les autres algorithmes STL. Les algorithmes utilisés sont généralisés, essentiellement dans des calculs mathématiques par rapport aux contenants, contient des éléments numériques. Mais cela ne signifie pas nécessairement. Et si vous n'êtes pas intéressé par le calcul numérique (par exemple à partir du domaine du traitement numérique du signal), alors vous pouvez juste sauter en toute sécurité cette partie de la présentation…

la liste STL présenté généralisée des algorithmes numériques: iota (la création d'une séquence augmentant de façon monotone), accumuler (accumulation), inner_product (skalyarnoe proïzvedenïe), partial_sum (somme partielle), adjacent_difference (différence adjacente).

Illustration fonctionne mieux pour tenir à l'algorithme utilisé et intuitive accumuler. Cet algorithme réduit (réduit la dimension) Récipient avec les valeurs d'accumulation. notamment, pour les valeurs numériques simples, il se tourne vecteur<> ou liste<> à une seule valeur de résultat scalaire.

algorithme accumuler (comment, cependant, la plupart des autres) elle a 2 formes syntaxiques:

Dans la 1ère forme (elle est moins intéressante) algorithme résume le la valeur des éléments de conteneur. Ne pas oublier en même temps, de telle sorte que chaîne, par exemple, opération ‘+‘ Cela signifie concaténation, collage). Dans la deuxième forme de l'algorithme recueille le résultat d'une opération binaire (fonction de 2 variables), utilisé pour accumuler la valeur (batterie) et à son tour à chacun des éléments de récipient.

On ne sait pas? Cette technique puissante, et maintenant tout sera clair à partir de l'exemple…

Dans les statistiques mathématiques sont utilisées plusieurs types de valeurs moyennes pour la séquence numérique:

  • moyenne arithmétique:

    SA1

  • moyenne géométrique:

    SG2

  • moyenne harmonique:

    SR3

  • La moyenne quadratique:

    SQ4

Nous ne rentrerons pas dans le sens de chaque option. Nous allons faire une demande, qui calcule la moyenne et quelques autres caractéristiques (dispersion, écart-type) à l'entrée une séquence numérique. L'entrée série d'entrée ou un terminal, ou la redirection de fichier de données pré-préparés:

Il est facile de voir, chaque formules mathématiques de complexes écrites ci-dessus est calculé uniquement sur une seule ligne, en utilisant la technique d'algorithmes généralisés:

algorithmes numériques Généralisées dans stl c ++

Ici, nous pouvons voir la relation bien connue, ce qui confirme la justesse de nos calculs. Il consiste dans le fait, que, pour toute suite de nombres moyenne arithmétique est supérieure ou égale à la moyenne géométrique, qui, à son tour, supérieure ou égale à la moyenne harmonique. Et l'égalité dans ces états ne peut être atteint que si tous les membres d'une séquence de nombres sont égaux:

algorithmes numériques Généralisées dans stl c ++

Nous reviendrons à l'étude du code. Le premier appel de l'algorithme accumuler( b, e, 0. ) Il montre la 1ère forme d'utilisation: Les valeurs du conteneur sont ajoutées à la valeur initiale 0.0.

avertissement!: points d'enregistrement à la valeur initiale constante, indiquant, il réel valeur - fondamentalement important. Sans ce code compilera même sans avertissements, mais fait avec complètement incorrect et extrêmement difficile dans les résultats d'interprétation! voici, les algorithmes qui sont définis comme modèle, et le type de troisième paramètre détermine l'accumulation des opérations internes sera utilisé pour tout type de données.

tout le reste (4 pièces) défis accumuler() utiliser la 2ème forme d'appel – Quatrième paramètre d'émission fonction accumulation. Comme on le voit d'après les exemples, il prend les paramètres actuels de la valeur accumulée et de l'élément suivant dans le conteneur. Et retourne l'opération accumulant. Pour plus de clarté,, accumuler toutes les fonctions sont écrites dans l'exemple d'une forme simple et claire. en pratique, pour éviter la dépendance du type de données traitées, ils sont aussi généralement écrites, en fonction du modèle. Ensuite, il pourrait ressembler à ceci:

enfin, note, si pas remarqué jusqu'à présent, que l'accumulation de montants nous utilisons la valeur initiale 0 (3-Première option accumuler() ), et l'accumulation de œuvres, naturellement, 1, avec le type de données correspondant.

Bulletin de nouvelles leçons sur la programmation:

Trier les structures. STL Часть 13




le tri des structures c ++, débutants stlMontré dans la section précédente divers tri - Mécanisme flexible et beau pour toutes les occasions. C'est juste dans la pratique, une sorte séquence presque jamais un pur. Cela est d'autant dans le domaine des tâches éducatives et de démonstration. En pratique, le plus souvent, le problème est triée des structures de données assez volumineuses (même volumineux en taille, et en fonction du nombre de ses champs). Et tri (ou recours) ils auront sur les valeurs pour les différents champs de ces mêmes structures. Mais voici venir à l'aide алгоритмы STL, en particulier lorsqu'ils sont utilisés conjointement avec le foncteurs.

Voyons voir le problème du modèle typique, que nous avons vu auparavant - une description du groupe de formation ou de la faculté:

Le programme demande le numéro de champ données, sur lequel le tri est effectué (en fait - la comparaison). Si ce nombre est entré, comme un nombre positif, puis trier par ce champ va dans l'ordre croissant. Si le nombre est entré avec un signe moins - l'ordre de tri est inversé:

le tri des structures c ++, débutants stlle tri des structures c ++, débutants stl

S'il vous plaît noter, que l'algorithme de tri ne se soucie pas de ce genre: si les données numériques, le plus grand, et si minuscules, afin leksograficheskom.

Bulletin de nouvelles leçons sur la programmation: