Existe-t-il des directives sur la manière d'écrire un nouveau conteneur qui se comportera comme n'importe quel STL
conteneur?
c++
stl
c++-standard-library
Avinash
la source
la source
Réponses:
Voici un I pseudo-conteneur séquence Rassemblé du § 23.2.1 \ 4 Notez que le
iterator_category
devrait être l' unstd::input_iterator_tag
,std::output_iterator_tag
,std::forward_iterator_tag
,std::bidirectional_iterator_tag
,std::random_access_iterator_tag
. Notez également que ce qui suit est techniquement plus strict que nécessaire, mais c'est l'idée. Notez que la grande majorité des fonctions "standard" sont techniquement optionnelles, en raison de la génialité des itérateurs.Aussi, chaque fois que je crée un conteneur, je teste avec une classe plus ou moins comme celle-ci:
Créez des conteneurs d'
tester
objets et appelez chacun d'euxfunction()
pendant que vous testez votre conteneur. Ne créez aucuntester
objet global . Si votre conteneur triche n'importe où, cetester
cours le feraassert
et vous saurez que vous avez triché accidentellement quelque part.la source
assert(tester::livecount == 0);
. Mmmmm, je ne sais toujours pas comment ce framework de testeur fonctionne. Pouvez-vous donner un exemple?memcpy
s'est produit. (le test n'est pas infaillible, mais il en attrape). Lelivecount
est un simple détecteur de fuite, pour vous assurer que votre conteneur a appelé un nombre égal de constructeurs et de destructeurs.verifier
nonvarifier
.std::iterator
l'en-tête<iterator>
Vous devrez lire la section Standard C ++ sur les conteneurs et les exigences imposées par la norme C ++ pour les implémentations de conteneurs.
Le chapitre pertinent de la norme C ++ 03 est:
Section 23.1 Exigences relatives aux conteneurs
Le chapitre pertinent de la norme C ++ 11 est:
Section 23.2 Exigences relatives aux conteneurs
Le projet quasi-final de la norme C ++ 11 est disponible gratuitement ici .
Vous pouvez aussi lire d'excellents livres qui vous aideront à comprendre les exigences du point de vue de l'utilisateur du conteneur. Deux excellents livres qui ont facilement frappé mon esprit sont:
Effective STL parScott Meyers et la
bibliothèque standard C ++: un didacticiel et une référence parNicolai Josutils
la source
Voici une implémentation très simpliste d'un faux vecteur, qui est essentiellement un wrapper
std::vector
et possède son propre (mais réel) itérateur, qui imite l'itérateur STL. Encore une fois, l'itérateur est très simpliste, sautant de nombreux concepts commeconst_iterator
contrôles de validité, etc.Le code est exécutable hors de la boîte.
la source