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

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. Операторы перенаправления ввода\вывода<< 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. Методы открытия\создания и закрытия файлов 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. Поскольку текстовый файлчастный случай бинарного, этот метод вполне применим и к текстовому файлу.

méthode Fermer()

Закрывает файл. Даже добавить нечего. Единственная пожалуй ремаркаот того, что файл, открытый для чтения, не будет закрыт этим методом как правило хуже не станет. Очень редки ситуации, когда открытый для чтения файл портится, если завершить программу не закрывая файл. Связана эта порча прежде всего с нестандартными устройствами типа стримеров на магнитной ленте или каких нибудь потоковых хитрых промышленных контроллерах, но по феншую стоит запомнитьоткрытый файл должен быть закрыт. Это считается хорошим тоном.

méthode eof()

Проверяет не достигнут ли конец файла. à savoir. можно ли из него продолжать чтение. Выше пример с считкой слов оператором >> 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 – Отсчитать новую позицию с конца файла
  • ios_base::begОтсчитать новую позицию с начала файла (абсолютное позиционирование)
  • ios_base::curПерескочить на n байт начиная от текущей позиции в файле (par défaut)

méthode tellg()

Иногда нужно получать информацию о том, сколько уже прочитано. В этом поможет метод tellg():

Он возвращает значение типа int, которое показывает сколько уже пройдено в байтах. Его можно использовать в паре с методом seekg(), чтоб получать размер файла:

В качестве примера работы методов бинарного чтения можно разобрать такой classe:

Подобные обертки-классы удобно использовать, если встречается задача читать из бинарного файла целые структуры.

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:

tri. STL (partie 12)




tri dans c ++, stlIl est un groupe spécial d'algorithmes de tri font - en pratique, il est nécessaire de trier une variété d'objets et sur une variété de critères. Une analyse des algorithmes de tri sont bien et étudié à fond, Plus que toute autre section de mathématiques computationnelles. Le principal problème de tout algorithme de tri est sa complexité de calcul - le nombre d'opérations de comparaison d'échange, nécessaire pour le tri d'une séquence de longueur N, que l'on appelle O( N ).

Le fait est que désagréable, que la complexité moyenne des différents algorithmes pour différents (sur la plupart des séquences de test) et la complexité maximale (au pire, d'un procédé de séquence de test). Depuis plusieurs dizaines d'algorithmes de tri, offert dans la programmation d'apprentissage, montré, que la grande majorité d'entre eux (intuitif) Il est le pire en termes de moyenne et en termes de complexité maximale. A titre d'exemple,, populaire parmi les étudiants bubble sort Il est le pire de tous généralement connus.

efficace (complexité) l'ensemble des méthodes ne sont que quelques méthodes de tri récursive rapide. Ils sont ensuite présentés aux implémentations de la STL d'algorithmes. Les normes ne pas insister sur une contrainte dure sur les mécanismes nationaux pour leur mise en œuvre, il peut donc être possible en fonction de la bibliothèque.

maintenant, ayant une certaine connaissance de algorithmes, foncteur et l'état général des affaires avec tri, nous sommes prêts à envisager des options pour la mise en œuvre tout cela dans votre code. Pour commencer une variété de façons séquence tri numérique. Exemple Velikon, mais il est non seulement, et que, pour illustrer le, pour la suite auto-expérimentation:

Avant de compiler le programme, en MVS appuyez sur Alt + F7 et entrez les arguments de commande ?30 +3:tri dans c ++

Quelques exemples gaucherie en raison du fait, que nous sommes dans le même code et combinons tous STL fourni des algorithmes de tri, et une variété de tests triée séquence, par exemple:

  • Plusieurs aléatoire (?) des séquences de longueur 30, sortable en utilisant (3) Comparaison de foncteur, et détaillé (+) des séquences d'entrée et de sortie du terminal:

    tri dans c ++

  • inverti (inverser, réduction) séquence, sortable (6) "Heap" en utilisant un arbre binaire (arguments de commande -30 +6 ):tri dans c ++

  • long (1000000) séquence, le même, le cas précédent, conditions de, mais seulement avec la conclusion de l'exactitude des résultats de diagnostic (arguments de commande -1000000 6 ):

    tri dans c ++

Les offres de la STL 3 algorithmes de groupe tri:

  • Trier() – le tri le plus rapide, en moyenne, ( la( N * bûche( N ) ), mais qui peut "tomber" dans le pire des cas à O( N * N ) (et il est un très mauvais indicateur);

  • sort_heap() – le tri "sur le tas", en utilisant un arbre binaire, dont la complexité toujours pas pire que O( N + N * bûche( N ) ) (pire Trier() en moyenne,, mais plutôt le pire des cas);

  • stable_sort() – "Stable" tri par fusion, ce qui signifie que la stabilité, qu'il maintienne l'ordre relatif des éléments égaux après triage. Il est parfois très important. La complexité de cet algorithme est bien inférieur Trier();

Utilisez l'algorithme, qui est le plus compatible avec les contraintes de votre problème.

Bulletin de nouvelles leçons sur la programmation: