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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é.

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