2010-11-29 6 views
6

J'essaie d'obtenir le code source vectoriel pour voir comment le vecteur standard std ou stl est implémenté.C++ code source vectoriel

Ceci est à des fins d'apprentissage. Maintenant, la question est où puis-je trouver le code source. Même le code source d'un autre conteneur C++ est également utile.

+3

Il est toujours bon de regarder et d'apprendre. Mais je ne suis pas sûr de regarder le code source de quelque chose d'aussi complexe que 'std :: vector' est un bon choix. Bien sûr, vous pourriez apprendre beaucoup, mais vous pourriez aussi vous perdre très facilement. – ereOn

+0

De nombreuses implémentations STL incluront beaucoup de code pour des choses comme le débogage d'itérateur - il sera difficile à lire et contiendra beaucoup de code qui n'est pas directement lié à ce que fait le vecteur. Peut-être pas le meilleur endroit pour apprendre. – AshleysBrain

Répondre

3

La plupart sinon la totalité du code source std::vector doit être contenue dans l'en-tête <vector> lui-même. Les conteneurs de bibliothèque standard sont tous des modèles de classe et en tant que tels, leurs définitions et les définitions de toutes leurs fonctions membres sont contenues dans leurs en-têtes respectifs.

Notez qu'il n'y a pas de mise en œuvre One True de l'un des conteneurs; chaque implémentation de la bibliothèque standard C++ est libre d'implémenter chaque conteneur comme bon lui semble, à condition qu'elle réponde aux exigences du conteneur.

10

Il n'existe pas de vecteur «standard». La norme définit le comportement et l'interface (ainsi que certains détails d'implémentation, tels que le stockage contigu), mais le code est à déterminer par les rédacteurs du compilateur.

Votre compilateur devrait avoir son propre fichier d'en-tête <vector>, avez-vous vérifié cela sur votre chemin d'inclusion de construction? Une fois que vous trouvez que vous devriez également voir les autres conteneurs STL dans leurs en-têtes respectifs. La liste pour Microsoft Visual C++ est here, y compris certains qui sont la propriété, donc attention à ce que par l'avertissement ci-dessous exemple:

Dans Visual C++ .NET 2003, les membres de les <hash_map> et <hash_set> tête fichiers sont ne figure plus dans l'espace de noms , mais a plutôt été déplacé dans l'espace de noms stdext. Voir stdext Espace de noms pour plus d'informations.

Sur mon installation de Visual C++ Express 2010, ils sont dans ce dossier:

c: \ program files \ Microsoft Visual Studio 10.0 \ vc \ include

5

exécution différent a une implémentation différente.

Mais je suppose que cela est ce que vous voulez, la mise en œuvre gcc largement utilisé: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/vector

Il est le principal fichier d'en-tête, et la mise en œuvre est en https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_vector.h et https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_bvector.h

Il utilise MACRO pour faire fonctionner le code en bonne performance et s'adapter à une situation variable, mais le rendre difficile à lire, je vous souhaite bonne chance.