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 :

extraire un sub set d'un autre type


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut extraire un sub set d'un autre type
    Bonjour,

    Je cherche a extraire un sub set d'un std::set, mais avec la particularité que ces deux set ne sont pas du même type. en effet le set principal est du type A* et le sous set est de type B * avec B héritant de A.

    j'y arrive en C-Style castant le set principal en set de B* et créant le sub set par le constructeur prenant deux iterator... mais la solution ne me convient pas.

    n'y a til pas moyen d'extraire un sub set en appliquant une fonction sur tous les éléments (pour les static_caster par exemple, en évitant bien évidement de dérouler a la main et de re-inserer les éléments un par un.)

  2. #2
    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
    Bonjour,
    En mixant « std::transform() » et « std::insert_iterator », tu devrais obtenir une solution satisfaisante.

    Sinon, si B hérite de A, pour passer de A à B il faut utiliser « dynamic_cast ».

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Le soucis avec un transform et un inserter c'est que ca va me traiter et re-insérer les éléments un a un, et l'insertion dans un set avec le re-tri est ici inutile. mes éléments sont déjà trié et gardent le même ordre. J'aimerai éviter de perdre le temps utilisé pour re-trier tout ca en fait.

    pour le dynamic_cast, ici je suis sur que mes A * sont des B *, il est donc safe et beaucoup plus rapide de les static_caster je pense.

    au final, je vais probablement contourner le problème en utilisant un std::vector en sortie, même si je perd la garantie d’unicité, le reserve et push_back sont négligeable dans mon cas.

    merci tout de même,

  4. #4
    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 typedef Voir le message
    Le soucis avec un transform et un inserter c'est que ca va me traiter et re-insérer les éléments un a un, et l'insertion dans un set avec le re-tri est ici inutile. mes éléments sont déjà trié et gardent le même ordre. J'aimerai éviter de perdre le temps utilisé pour re-trier tout ca en fait.
    Parce que tu crois que le contructeur par intervalle n'insère pas les éléments un par un ?
    Il n'y a aucune contrainte sur les éléments de l'intervalle, alors rien ne dit qu'ils sont déjà triés ou uniques.
    À mon avis, le seul moyen de ne pas retrier les éléments à insérer est de passer par le contructeur par recopie.
    Et encore…

    Citation Envoyé par typedef Voir le message
    pour le dynamic_cast, ici je suis sur que mes A * sont des B *, il est donc safe et beaucoup plus rapide de les static_caster je pense.
    Je ne m'y connais pas assez en transtypage pour avoir un avis.
    Je sais juste que pour passer d'une classe-mère à l'une de ses classes-filles, il faut normalement utiliser « dynamic_cast » ; je ne sais pas ce qu'il se passe si l'on essaie d'utiliser « static_cast » dans ce cas.

    Quoiqu'après tout, tu travailles avec des pointeurs.
    Du coup, peut-être que « reinterpret_cast » est plus efficace…

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Parce que tu crois que le contructeur par intervalle n'insère pas les éléments un par un ?
    Il n'y a aucune contrainte sur les éléments de l'intervalle, alors rien ne dit qu'ils sont déjà triés ou uniques.
    À mon avis, le seul moyen de ne pas retrier les éléments à insérer est de passer par le contructeur par recopie.
    Et encore…
    C'est ce que je pensais aussi, mais en fait en faisant des tests je me suis apercut qu'en utilisant le constructeur par interval j'avais de bien meilleur perf qu'en utilisant std::copy avec un inserter, j'en ai deduis (un peu rapidement j'avoue :p) que le constructeur en question ne re-triait pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/04/2019, 18h52
  2. Réponses: 4
    Dernier message: 28/08/2006, 13h04
  3. [VB.NET] Récupération des settings dans un autre module
    Par boulete dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/04/2006, 16h05
  4. Objet d'un type initialisé avec un autre type.
    Par Pragmateek dans le forum C++
    Réponses: 28
    Dernier message: 30/03/2006, 20h06
  5. Réponses: 14
    Dernier message: 13/03/2006, 18h49

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