IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

vector & size_type


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut vector & size_type
    Je voudrais faire une fonction pour initialiser une série de vecteurs (clear() + reserve()).

    Pour le reserve, j'ai besoin d'une taille. En théorie, ma fonction devrait donc prendre un paramètre size_type, car c'est ce que prend la méthode reserve(). Or, le type size_type est dépendant de l'instanciation de vecteur. Par exemple :

    Or, je ne vois pas pourquoi le type définissant le nombre d'éléments d'un vecteur devrait dépendre du type des éléments contenus par ce vecteur.

    C'est bien entendu de la curiosité intellectuelle, car je sais bien que je peux juste travailler avec des unsigned int...

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Ou avec size_t (ou std::size_t, je sais plus lequel est le vrai bon).

    Il y a de l'explication dans la réponse de David Rodrigez là : http://stackoverflow.com/questions/2...-encapsulation

    I would use a typedef in the class. The reason is that for std::vector, the size type is std::size_t, but if you later change the code to use a container (hand rolled) whose size type is not std::size_t redefining the typedef will be enough.

    Using that typedef does not expose any detail of implementation, and it in fact helps encapsulate. The important element in the typedef is the local name, not what it is defined to be.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( mytype::size_type i = 0; i < myelement.size(); ++i )
    In the for loop above, user code is unaware of whether size_type is a signed or unsigned type, it just works. You can change your implementation, and as long as you update the typedef the previous code will compile without signed/unsigned comparison warnings. The typedef actually helps encapsulation.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Histoire de poursuivre l'exercice intellectuel, size_type n'est garanti comme étant size_t que pour les conteneurs standard qui utilisent l'allocateur par défaut...

    Il est étrange qu'il n'y ait pas moyen d'accéder à des membres ne dépendant pas du type des éléments sans recourir à une instanciation particulière du template.

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Cela dit tu peux toujours utiliser une déclaration extern template pour ne pas instantier le template immédiatement...

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    vector<T,Alloc>::size_type est Alloc::size_type, qui lui même est défini comme étant un type entier non signé qui peut représenter la taille du plus gros objet dans le modèle d'allocation (quel que soit l'allocateur).

    std::size_t est déclaré et défini dans <cstddef> comme étant un lien sur ::size_t (en utilisant une directive using). size_t a grosso-modo la même définition que Alloc::size_type. Du coup, A moins de développer un allocateur spécifique qui ne suivrait pas la norme (et qui donc pourrait amener un programme dans un état indéfini), on peut considérer que Alloc::size_type est std::size_t ou un autre type intégral non signé permettant de stocker au moins la même chose.

    Si sizeof(Alloc::size_type) > sizeof(std::size_t) alors tous les bits en trop ne seront pas utilisés, puisque par définition, std::size_t est capable de stocker la taille maximale d'un objet alloué dans le système. Du coup, un cast vers std::size_t ne fera pas perdre d'information.

    Au final, std::size_t est un candidat nécessaire et suffisant pour faire ce que tu veux faire.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    vector<T,Alloc>::size_type est Alloc::size_type, qui lui même est défini comme étant un type entier non signé qui peut représenter la taille du plus gros objet dans le modèle d'allocation (quel que soit l'allocateur).
    Mais quel rapport entre la taille du plus gros objet, et le nombre d'objets stockés, puisque manifestement, la taille de la mémoire disponible ne fait pas partie des données considérées ?

    Citation Envoyé par Emmanuel Deloget Voir le message
    std::size_t est déclaré et défini dans <cstddef> comme étant un lien sur ::size_t (en utilisant une directive using). size_t a grosso-modo la même définition que Alloc::size_type. Du coup, A moins de développer un allocateur spécifique qui ne suivrait pas la norme (et qui donc pourrait amener un programme dans un état indéfini), on peut considérer que Alloc::size_type est std::size_t ou un autre type intégral non signé permettant de stocker au moins la même chose.
    Si au final, la norme nous oblige à rester scotché à size_t, que est l'intérêt de faire un détour par Alloc::size_type ? Et pourquoi vector<>.reserve() ne prend-il pas tout simplement un paramètre de type std::size_t ?

    Citation Envoyé par Emmanuel Deloget Voir le message
    Au final, std::size_t est un candidat nécessaire et suffisant pour faire ce que tu veux faire.
    Oui, effectivement, mais ça me laisse le sentiment que le truc a été mal pensé.

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par oodini Voir le message
    Mais quel rapport entre la taille du plus gros objet, et le nombre d'objets stockés, puisque manifestement, la taille de la mémoire disponible ne fait pas partie des données considérées ?
    La taille maximale que peut prendre un vecteur est atteinte pour numeric_limits<std::size_t>::max() éléments de 1 byte (des char, par exemple).

    Citation Envoyé par oodini Voir le message
    Si au final, la norme nous oblige à rester scotché à size_t, que est l'intérêt de faire un détour par Alloc::size_type ? Et pourquoi vector<>.reserve() ne prend-il pas tout simplement un paramètre de type std::size_t ?
    Rien n'empêche de mettre un Alloc::size_type plus gros que std::size_t ; du moment qu'il n'est pas plus petit, ça marchera.

    Citation Envoyé par oodini Voir le message
    Oui, effectivement, mais ça me laisse le sentiment que le truc a été mal pensé.
    Ce n'est pas impossible. Je n'avais pas réfléchi à ça. En même temps, on souhaite stocker des tailles ou des nombre d'objets. La valeur est > 0 et peut être potentiellement très grande. Il y a peu de candidats viables
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par Emmanuel Deloget Voir le message
    vector<T,Alloc>::size_type est Alloc::size_type, qui lui même est défini comme étant un type entier non signé qui peut représenter la taille du plus gros objet dans le modèle d'allocation (quel que soit l'allocateur).
    Si j'en crois ceci, c'est même plus fort :
    Implementations of containers described in this International Standard are permitted to assume that their Allocator template parameter meets the following two additional requirements beyond those in Table 32.
    — All instances of a given allocator type are required to be interchangeable and always compare equal to each other.
    — The typedef members pointer, const_pointer, size_type, and difference_type are required to be T*,T const*, size_t, and ptrdiff_t, respectively.
    Je comprends qu'un allocator::size_type doit être un size_t.

    Citation Envoyé par Emmanuel Deloget Voir le message
    Ce n'est pas impossible. Je n'avais pas réfléchi à ça.
    A mon humble avis, ce n'est que pour ne pas créer d'interdépendance puisque size_t n'est pas un type natif. Un conteneur n'est alors dépendant que de ses paramètres génériques.

  9. #9
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    size_t n'est pas un type natif.
    Qu'est-ce que tu entends par là ?

    Citation Envoyé par Emmanuel Deloget Voir le message
    std::size_t est déclaré et défini dans <cstddef> comme étant un lien sur ::size_t (en utilisant une directive using).
    Ça ne suffit pas pour dire qu'il est natif ?
    Ce symbole provient du C, si je ne m'abuse (un typedef sur unsigned int il me semble).

    À moins que ça ne soit une implémentation propre au compilateur... ?

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Rien n'empêche de mettre un Alloc::size_type plus gros que std::size_t ; du moment qu'il n'est pas plus petit, ça marchera.
    Josuttis, dans The C++ Standard Library", indique, pour allocator:size_type :

    "To be usable by the standard containers, this type must be equivalent to size_t"

    Bref, les tailles pour les conteneurs standard sont donc forcément exprimés en size_t. Dès lors, pourquoi ce membre size_type ?

  11. #11
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Qu'est-ce que tu entends par là ?
    C'est un type standard, mais il est quand même créé par un typedef, contrairement aux types scalaires intégraux de base (char, int, short, long, long long et les versions unsigned).

    Citation Envoyé par Steph_ng8 Voir le message
    Ça ne suffit pas pour dire qu'il est natif ?
    Ce symbole provient du C, si je ne m'abuse (un typedef sur unsigned int il me semble).

    À moins que ça ne soit une implémentation propre au compilateur... ?
    Probablement unsigned long, ou unsigned long long. Le type exact est implementation defined
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par oodini Voir le message
    Dès lors, pourquoi ce membre size_type ?
    Citation Envoyé par 3DArchi Voir le message
    A mon humble avis, ce n'est que pour ne pas créer d'interdépendance puisque size_t n'est pas un type natif. Un conteneur n'est alors dépendant que de ses paramètres génériques.

    @steph: comme dit Emmanuel, par (mon propos maladroit) type natif, je voulais dire qu'il nécessite l'inclusion d'un fichier d'en-tête déclarant le type size_t. Et je pense que c'est pour cela qu'un conteneur attend de son allocateur la définition d'un type allocator:size_type, pour éviter une dépendance supplémentaire.

    @Emmanuel : pour l'article sur les droits de propriétés.

  13. #13
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    @Emmanuel Deloget et @3DArchi ok et merci.

  14. #14
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    @Emmanuel : pour l'article sur les droits de propriétés.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. vector<T>::size_type est-il constant en T ?
    Par BaygonV dans le forum Débuter
    Réponses: 5
    Dernier message: 03/04/2014, 14h58
  2. equivalent Vector du jsp
    Par Djib dans le forum ASP
    Réponses: 4
    Dernier message: 05/12/2003, 08h07
  3. "vector" provoque "syntax error", malgré
    Par seenkay dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/08/2003, 03h21
  4. Réponses: 2
    Dernier message: 11/07/2003, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo