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

C++ Discussion :

std::list ou std::vector comme argument de template


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut std::list ou std::vector comme argument de template
    bonjour,

    je dois creer une fonction du genre: create_set_from_list
    mais j'aimerais que list soit un vector ou une list

    pour l'instant j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template<class T>
    std::set<T> create_set_from_list(const std::vector<T> &list)
    {
        std::set<T> myset;
        typename std::vector<T>::const_iterator it;
     
        for( it=list.begin(); it!=list.end(); ++it) {
            myset.insert(*it);
        }
     
        return myset;
    }
    comment rendre std::vector un argument du template?

    (je n'obtiens que des erreurs de compilation :-/)

  2. #2
    Invité
    Invité(e)
    Par défaut
    A priori c'est impossible d'utiliser std::vector comme un paramètre template template : la norme ne précise pas le nombre d'argument des class standards. Par contre tu peux faire quelquechose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<class T, class Cont = std::vector<T> >
    std::set<T> create_set_from_list(const std::vector<T> &list)
    {
    //....
    }
    Peut-être sera-t-il possible de définir la signature d'une class template standard en C++11, avec les template aliases, à voir quand ce sera implémenté

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template<class T, template<typename,typename> class L, class Alloc>
    std::set<T> create_set_from_list(const L<T,Alloc> &list)
    {
        std::set<T> myset;
        typename L<T,Alloc>::const_iterator it;
     
        for( it=list.begin(); it!=list.end(); ++it) {
            myset.insert(*it);
        }
     
        return myset;
    }
    marche sur macosx gcc 4.2.1

    mais ce n'est pas portable alors?

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Tu veux de la généricité? Alors demande un range. (une pair d'itérateur).

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Plein de solution pour ce que tu veux faire :
    - ne pas créer de fonction
    Tu peux créer un set à partir d'un vector ou list directement, à l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::set<int> s (v.begin(), v.end());
    ou avec insert() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::set<int> s;
    s.insert(v.begin(), v.end());
    ou avec std::copy() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::set<int> s;
    std::copy(v.begin(), v.end(), std::inserter(s, s.begin()));
    - habituellement, pour les algorithmes de la stl, on passe un paire d'iterator (ou un range, comme dit Goten) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template<class ITERATOR>
    std::set<typename ITERATOR::value_type> create_set_from_list2(ITERATOR first, ITERATOR last)
    {
        std::set<typename ITERATOR::value_type> myset;
        typename ITERATOR::const_iterator it;
     
        for( it=first; it!=last; ++it)
        {
            myset.insert(*it);
        }
     
        return myset;
    }
    - Sinon, tu peux considérer le conteneur comme étant lui même le paramètre template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template<class CONT>
    std::set<typename CONT::value_type> create_set_from_list2(const CONT& list)
    {
        std::set<typename CONT::value_type> myset;
        typename CONT::const_iterator it;
     
        for( it=list.begin(); it!=list.end(); ++it)
        {
            myset.insert(*it);
        }
     
        return myset;
    }
    Voilà, je crois avoir fait le tour
    Bonne continuation

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    génial!

    j'ai utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::set<int> s;
    s.insert(v.begin(), v.end());
    cela m'évitait de faire une copie :-)

    merci beaucoup pour vos réponses

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

Discussions similaires

  1. std::stable_sort et std::list
    Par darkman19320 dans le forum C++
    Réponses: 3
    Dernier message: 02/10/2012, 11h40
  2. Convertir un Generic::List en std::list
    Par Clemsgc dans le forum SL & STL
    Réponses: 7
    Dernier message: 19/06/2009, 00h22
  3. [Tuto] Recherche de tutoriel sur std::list et std::vector
    Par pegase06 dans le forum SL & STL
    Réponses: 27
    Dernier message: 24/07/2007, 16h23
  4. Réponses: 18
    Dernier message: 03/07/2006, 15h53
  5. Réponses: 14
    Dernier message: 16/05/2006, 11h26

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