La rédaction de votre propre Conteneur STL
Sont là des lignes directrices sur la façon dont on devrait écrire un nouveau conteneur qui se comportent comme n'importe STL
conteneur?
- Voir les implémentations de la norme actuelle, les conteneurs, et d'essayer de les comprendre - les fonctions, les types de retour, la surcharge de l'opérateur, les types imbriqués, gestion de la mémoire et de tous.
- D'habitude, je commence par la copie de la fonction de membre de prototypes de n'importe quel conteneur le plus proche dans le concept de ce que je fais, que ce soit à partir de msdn ou la norme. (cplusplus.com n'a pas de C++11 fonctions, et www.sgi.com ne correspond pas)
- Canard: vous pensez msdn est plus proche de la norme de sig?
- Il est certainement. MSDN est en cours - SIG est la pré-Norme
- J' (à tort) estime que le stuff que j'avais vu chez cplusplus.com a partir de SGI. Je ne sais pas comment bon SGI est, mais ils n'ont pas de C++11 choses que je vois. MSDN n'.
- Voir la complexité des garanties pour les différents types de conteneurs. stackoverflow.com/questions/181693/...
- cplusplus.com est manifestement erronée,il y avait un fil autour d'ici,qui a souligné les erreurs,vous souhaitez peut-être à la recherche pour elle.
- Le meilleur en ligne de référence (par rapport à l'exhaustivité, l'exactitude et surtout de la convivialité) est de loin cppreference.com. Il explique également une tonne de fonctionnalités de langage en dehors de la bibliothèque. Et c'est un wiki, donc il doit contenir moins d'erreurs que cplusplus.com.
Vous devez vous connecter pour publier un commentaire.
Voici une séquence pseudo-conteneur, j'reconstitué à partir d' § 23.2.1\4 de Noter que la
iterator_category
devrait être l'un desstd::input_iterator_tag
,std::output_iterator_tag
,std::forward_iterator_tag
,std::bidirectional_iterator_tag
,std::random_access_iterator_tag
. Notez également que le dessous est techniquement plus stricte que nécessaire, mais c'est l'idée. Notez que la grande majorité de la "norme" fonctions sont techniquement en option, en raison de l'awesomeness qui est des itérateurs.Aussi, chaque fois que je fais un récipient, j'ai test avec une classe plus ou moins comme ceci:
À la fabrication des récipients de
tester
objets, et d'appeler chacunfunction()
que vous testez votre conteneur. Ne pas faire à l'échelle mondialetester
objets. Si votre conteneur des tricheurs partout, cetester
classeassert
et vous saurez que vous avez triché accidentellement quelque part.assert(tester::livecount == 0);
. Mmmmm, pas encore sûr de savoir comment ce testeur cadre de travaux. Pourriez-vous nous donner un exemple?memcpy
qui s'est passé. (test n'est pas infaillible, mais il attrape quelques-uns). Lelivecount
est un simple détecteur de fuites, assurez-vous que votre conteneur appelé un nombre égal de constructeurs et destructeurs.verifier
pasvarifier
.std::iterator
de l'en-tête<iterator>
size
,max_size
,empty
, etget_allocator
devrait être const.const_reference
etconst_pointer
hors deallocator
. J'ai été en utilisant le présent de mettre en place un STL style container... le travail fantastique de par la manière dont!typedef typename A::reference const_reference;
. C'est problématique parce qu'il fait toutes lesconst_reference
retour d'un non-const de référence. Il devrait au moins êtretypedef typename A::const_reference const_reference;
... droit? Je ne sais rien à propos de savoir si ou non typedef devrais même pas être là... c'est dans votre exemple.reference
etpointer
ont été à la fois mal nommée-et à tort const qualifié. Fixe.Vous aurez besoin de lire la Norme C++ section sur les Conteneurs et les exigences de la Norme C++ impose pour les implémentations de conteneur.
Le chapitre correspondant du C++03 standard est:
De L'Article 23.1 Du Conteneur
Le chapitre correspondant du C++11 standard est:
De L'Article 23.2 Du Conteneur
Le proche-version finale du projet de C++11 standard est disponible gratuitement ici.
Vous pourriez aussi bien, de lire quelques excellents livres qui vous aideront à comprendre les exigences d'un point de vue de l'utilisateur du conteneur. Deux excellents livres qui a frappé mon esprit sont facilement:
Efficace STL par Scott Meyers &
Le C++ Standard Library: Un Tutoriel et de Référence par Nicolai Josutils
Voici un très simpliste de la mise en œuvre d'un faux vecteur, qui est en fait un wrapper autour de
std::vector
et dispose de son propre (mais réel) itérateur, qui imite la STL itérateur. Encore une fois, l'itérateur est très simpliste, sautant sur de nombreux concepts commeconst_iterator
, contrôles de validité etc.Code est praticable hors de la boîte.