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 :

Manipulations de vector, std::sort et std::unique


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut Manipulations de vector, std::sort et std::unique
    Bonjour
    soit un boost::numeric::ublas ::vector vTerm (4)
    1 2.1 2.2 3 4
    où les nombres ci-dessus sont des intervalles de temps par exemple

    et une fréquence m = 2




    Je voudrais obtenir le vector suivant vTemp:
    0.1 0.2 0.5 1 1.1 1.2 1.5 2 2.1 2.2 2.5 3 3.5 4

    Comment je l'obtiens?
    Voila ce que je voudrais faire
    JE prends le premier terme de vTerm càd 1
    Comme j'ai une fréquence de 2
    le 1 tombera en 0.5 et en 1

    Ensuite je prends le second terme (càd 2.1)
    j'aurais (tjs avec ma fréquence de 2) : 0.1 0.6 1.1 1.6 2.1

    Pour le suivant 2.2 -> 0.2 0.7 1.2 1.7 2.2

    Pour le suivant 3 -> 0.5 1 1.5 2 2.5 3
    Pour le dernier 4 -> 0.5 1 1.5 2 2.5 3 3.5 4

    Ensuite je remets tout ensemble dans un vector
    0.5 1 0.1 0.6 1.1 1.6 2.1 0.2 0.7 1.2 1.7 2.2 0.5 1 1.5 2 2.5 3 0.5 1 1.5 2 2.5 3 3.5 4

    Je trie, je supprime les doublons et j'obtiens
    0.1 0.2 0.5 1 1.1 1.2 1.5 2 2.1 2.2 2.5 3 3.5 4

    Bon en théorie c'est bien joli, mais j'ai un peu du mal en pratique

    Voila ce que j'ai fait


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    bu::vector<Term> vTemp(vTerm.size());  // JE sais pas quoi donner comme taille => je donne par défaut celle la...???
    for (unsigned i = 0; i< vTerm.size(); i++)
    {
    	for (Term k = vTerm(i) ; k>0; k-= 1.0/m)
    	{
    		*(vTemp.begin()) = k;
    		vTemp.resize(vTemp.size()+1, true);  ///ICI J'ai l'impression que ca foire...
    	}
    }
     
    std::sort (vTemp.begin(), vTemp.end());  // Tri du vector vTemp
    bu::vector<Term>::iterator it = std::unique( vTemp.begin(), vTemp.end());  // suppression des doublons dans l'intervalle begin() -> it()
     
    bu::vector<Term> vTemp2(vTemp.size());
    std::copy(vTemp.begin(), it, vTemp2.begin());
     
    for (unsigned compt= 0; (vTemp(compt)< vTemp(compt-1)) && (compt < vTemp2.size()); compt++){}
     
    vTemp2.resize(compt, true);
     
    vTemp.resize(vTemp2.size(), false);
    std::copy(vTemp2.begin(), vTemp2.end(), vTemp.begin());
    Forcément ca ne fonctionne pas mais je vois vraiment pas où et j'ai surtout l'impression de me compliquer la vie...
    Si qqun voit, j'accepte avec grand plaisir sa contribution.. ;-)

  2. #2
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    J'ai oulblié de rajouter que je dois absolument travailler avec des UBLAS::vector (pcq tout le restant du projet est codé comme ca..)
    Mais je pense pas que ce soit là que se trouve le problème...

    Tks

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut,
    j'ai pas tout compris mais que fait ce bout de code??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (unsigned i = 0; i< vTerm.size(); i++)
    {
    	for (Term k = vTerm(i) ; k>0; k-= 1.0/m)
    	{
    		*(vTemp.begin()) = k;
    		vTemp.resize(vTemp.size()+1, true);  ///ICI J'ai l'impression que ca foire...
    	}
    }
    [edit]
    a part remplacer a chaque fois le premier élément et agrandir ton tableau, je ne vois pas...

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    J'essaie de créer un vector vTemp qui concatene toutes les suites intermédiaires
    càd 0 0.5 1 + 0.1 0.6 1.1 1.6 2.1 + etc etc

    Le problème est que je ne sais pas à priori quelle sera sa taille => je bidouille qqch au début pour faire un resize à la fin , mais je crois pas que ca fonctionne...

    Après ca je suis censé le trier et enlever les doublons (std::sort et std::unique)

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut,
    tu devrait le faire en deux temps. Commence avec un vector de la stl et copie le resultat dans ton bu::vector. Cela évitera de faire une allocation memoire + une reopie à chaque ajout.




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    std::vector vectortmp;//vecteur de 0 element
    vectortmp.reserve(10000);//tu reserve aproximativement la memoire. le nombre d'element n'as pas changé
    for (unsigned i = 0; i< vTerm.size(); i++)
    {
    	for (Term k = vTerm(i) ; k>0; k-= 1.0/m)
    	{
    		vectortmp.push_back( k);//ajouter 1 au nombre d'élément et  reallouer la memoire si besoin et met l'élément a la fin
    	}
    }
    //copie le resultat dans ton bu::vector
    bu::vector<Term> vTemp(vectortmp.size()); 
    std::copy(vectortmp.begin(),vectortmp.end(),vTemp.begin());

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

Discussions similaires

  1. std::sort lent pour les short int
    Par piedintelligent dans le forum SL & STL
    Réponses: 5
    Dernier message: 27/01/2012, 19h39
  2. std::list ou std::vector comme argument de template
    Par epsilon68 dans le forum C++
    Réponses: 11
    Dernier message: 02/03/2011, 00h34
  3. fonction std::sort() et visual C++
    Par maarek dans le forum C++
    Réponses: 6
    Dernier message: 29/08/2008, 19h40
  4. [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, 17h23
  5. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 20h15

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