conteneur conforme stl

J’ai été curieux de savoir ce qu’il faut entendre par un conteneur conforme à la norme stl (ou conforme à la norme boost, je crois comprendre qu’ils sont identiques ou très similaires). J’ai vu quelques exemples de ce que les gens appellent «conforme à stl» (par exemple, celui-ci sur codeproject et, bien entendu, les véritables conteneurs stl), mais je ne sais pas exactement quels composants de ces conteneurs sont nécessaires.

D’après ce que j’ai pu recueillir, j’ai besoin au moins de ces choses:

  1. Itérateurs compatibles STL (la stl actuelle utilise uniquement des iterators bidirectionnels ou supérieurs, je ne sais pas s’il s’agit d’une exigence ou si cela se produit, tout en déterminant ce qui est nécessaire pour être considéré comme un “iterator conforme à stl”)

  2. Mécanisme de définition des allocateurs (par défaut à std::allocator ), ainsi que de leur utilisation correcte (essayant toujours de comprendre ce que cette dernière partie signifie)

  3. public typedefs pour la métaprogrammation (type de pointeur, type de pointeur const, type de référence, type de valeur, type de référence const, type de différence, peut-être d’autres?). Question secondaire: Qu’est-ce qu’un difference type ?

  4. ‘generic’ (c’est-à-dire utilise des métaprogrammations / modèles pour rendre le conteneur capable de contenir à peu près n’importe quel type)

Y a-t-il autre chose que j’ai manqué, ou pire, que je me suis trompé dans la liste ci-dessus (peut-être des choses telles que const-correctness, sécurité des threads, génération / gestion d’exceptions, etc.)? En outre, existe-t-il un cahier des charges quelque part précisant ce qui est requirejs, s’il en existe un?

  1. Itérateurs: la bibliothèque standard définit les catégories d’iterators. Vous souhaitez fournir des iterators qui modélisent l’une de ces catégories. Selon votre sharepoint vue, istream_iterator et ostream_iterator autorisent les stream à être des conteneurs qui ne fournissent pas d’iterators bidirectionnels.

  2. Fondamentalement, vous utilisez allocate allocate(n) de l’allocateur pour allouer de l’espace pour n objects et deallocate(p, n) pour libérer de l’espace pour n objects pointés par p . Normalement, vous n’utilisez ni le construct ni le membre destroy l’allocateur.

  3. Oui, il y en a quelques autres (par exemple, les conteneurs associatifs définissent un type de key_type ). difference_type est un type pouvant représenter la différence entre deux pointeurs. Il est normalement fourni par l’allocateur, de sorte qu’un conteneur aura simplement une typedef ressemblant à ceci:

    typedef Allocator :: difference_type différence_type;

  4. Il n’y a pas nécessairement (ni même couramment) de métaprogrammation impliquée, juste une programmation générique (assez basique). C’est-à-dire que vous définissez un modèle, mais ne réalisez pas nécessairement de calcul au moment de la compilation (ce serait une métaprogrammation).

La norme actuelle ne définit rien sur la sécurité des threads. La référence ultime pour ce qui est requirejs est la norme C ++ elle-même. Vous pouvez télécharger gratuitement la version actuelle du prochain standard C ++ 0x ( N3242 ). Les exigences relatives aux conteneurs figurent à la section 23.2. Vous pouvez également vous intéresser à la bibliothèque standard de Josuttis, la bibliothèque standard C ++ – une lecture un peu plus douce que la norme elle-même.

Mise à jour: bien sûr, C ++ 11 (légèrement après sa rédaction initiale) a ajouté des threads, ainsi que quelques définitions sur la sécurité des threads, les courses de données, etc. Cela précise en gros ce que la plupart des gens ont déjà fait: la lecture en parallèle est autorisée, mais l’écriture doit être exclusive.