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::vector et allocation avec valeurs diff�rentes


Sujet :

C++

  1. #1
    Membre �clair�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Sant�

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par d�faut std::vector et allocation avec valeurs diff�rentes
    Bonjour tout le monde,

    Par curiosit�, je me demandais s'il existait dans la STL un moyen d'initialiser un std::vector avec diff�rentes valeurs lors de la cr�ation de celui-ci.

    Voici un petit exemple de ce que j'avais en t�te:

    Soit une classe/structure Foo:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    struct Foo
    {
       Foo(int _val = -1) : val(_val), atest(false);
     
      int val;
      bool atest;
    };
    On pourrait initialiser le vecteur de la mani�re suivante:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::vector<Foo> fooVec(200, [x = 0]() mutable { return Foo(x++); });
    Ce code ne fonctionne pas bien �videmment mais est quand m�me tr�s proche de celui-ci qui est fonctionnel (en C++11):

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    #include <algorithm>
    std::vector<Foo> fooVec(200);
    std::generate(fooVec.begin(), fooVec.end(), [x = 0] () mutable { return Foo(x++); });
    L'inconv�niant ici c'est qu'il y a un parcours du vecteur qui est fait en plus.

    J'ai vu �galement ici que l'on peut utiliser des it�rateurs mais je trouve qu'il y a beaucoup de code pour pas grand chose.

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    C'est s�rement possible en utilisant std::back_inserter.
    Mais la syntaxe est peu lisible imo. C'est une fonction rarement usit�e et donc pas forc�ment facile � comprendre.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    std::vector<double> vec;
    std::generate_n(std::back_inserter(vec), 42, []() { return rand(); });
    https://stackoverflow.com/a/2860739

    Ou juste std::generate_n
    https://stackoverflow.com/a/22291424
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre �clair�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Sant�

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par d�faut
    Justement avec std::generate_n ou std::generate, le probl�me vient du fait de parcourir une nouvelle fois le vecteur.

    Je voulais savoir si on pouvait cr�er un vecteur en initialisant chaque valeur de celui-ci � la vol�e.

  4. #4
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Citation Envoy� par darkman19320 Voir le message
    J'ai vu �galement ici que l'on peut utiliser des it�rateurs mais je trouve qu'il y a beaucoup de code pour pas grand chose.
    Le code utile dans ton cas ne concerne que iota_iterator qui ne fait qu'une trentaine de ligne et n'impl�mente que le n�cessaire pour respecter l'interface d'un ForwardIterator. C'est tr�s compliqu� de faire moins.

    Apr�s, tu peux regarder range qui permet de faire quelque chose comme myvector = generate(foo) | iota(x) | to_vector.

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Citation Envoy� par darkman19320 Voir le message
    Justement avec std::generate_n ou std::generate, le probl�me vient du fait de parcourir une nouvelle fois le vecteur.

    Je voulais savoir si on pouvait cr�er un vecteur en initialisant chaque valeur de celui-ci � la vol�e.
    � quel moment dans le code que j'ai pr�sent� on parcourt 2 fois un vector ?
    Citation Envoy� par Bousk Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    std::vector<double> vec;
    std::generate_n(std::back_inserter(vec), 42, []() { return rand(); });
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  6. #6
    Membre �clair�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Sant�

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par d�faut
    Autant, pour moi, je n'avais pas fait attention � l'initialisation du vecteur.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 27/10/2017, 16h01
  2. Champs identiques avec valeur diff�rente where dans une m�me table
    Par Cyrus59 dans le forum Requ�tes et SQL.
    R�ponses: 3
    Dernier message: 17/11/2014, 16h56
  3. [WD18] Remplir combo dans une table avec valeurs diff�rentes
    Par turkijudo dans le forum WinDev
    R�ponses: 1
    Dernier message: 03/11/2014, 10h27
  4. R�ponses: 5
    Dernier message: 20/03/2009, 10h31
  5. std::list, std::vector et allocation m�moire
    Par buzzkaido dans le forum SL & STL
    R�ponses: 20
    Dernier message: 15/06/2007, 15h58

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