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

  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

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut
    Citation Envoy� par epsilon68 Voir le message
    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());
    C'est, en tout cas, le code le plus simple ...

    Tu aurais, d'ailleurs, pu utiliser directement le constructeur de set, qui fonctionne avec les it�rateurs compatibles:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::set<int> s(v.begin(), v.end());
    Mais...
    cela m'�vitait de faire une copie :-)
    BEEEEEPPP... h� non, merci d'avoir essay� ...

    Insert fait, d'office, une copie de l'objet, quel que soit l'objet, quel que soit le conteneur au d�part duquel on appelle cette fonction (tout comme push_bak/push_front pour les conteneurs qui les ont)...

    Au mieux, on peut dire que ce qui est point� par un pointeur n'est pas copi� (mais le pointeur l'est, quant � lui bel et bien )
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  8. #8
    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
    le set<std::string> etait un membre d'une classe

    donc je ne peux pas utiliser le constructeur car je dois l'initialiser dans une autre fonction, du style "create".

    eviter la copie signifiait la copie du set si je faisais:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    m_set = create_from_list(myvalues);
    la il y a une copie.

  9. #9
    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
    @koala01 et epsilon68
    Vous ne parlez pas de la m�me copie. koala01 parle de la copie de vector -> set et epsilon68 parle de la copie de set (interne � la fonction) -> set (externe)

    J'ai un doute... il y a bien copie du set vers le set lors du retour de le fonction (pas de swap ou move qui copierait que le pointeur interne de set et non l'ensemble des donn�es) ?

    (� mon avis, il y a copie, mais on sait jamais avec les optimisations des compilateurs et avec c++0x)

  10. #10
    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
    nrvo. (y'a pas de copie)

  11. #11
    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
    certains compilateurs peuvent ne pas faire de nrvo (surement mineur)
    en tous les cas, si on peut �viter le doute....

  12. #12
    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
    Merci Goten, je me doutais qu'il devait y avoir une optimisation quelque part

+ 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