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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    Septembre 2006
    Messages
    113
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    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 confirm�
    Inscrit en
    Septembre 2006
    Messages
    113
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    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 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    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 035
    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 confirm�
    Inscrit en
    Septembre 2006
    Messages
    113
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    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 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    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 035
    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, 18h39
  2. std::list ou std::vector comme argument de template
    Par epsilon68 dans le forum C++
    R�ponses: 11
    Dernier message: 01/03/2011, 23h34
  3. fonction std::sort() et visual C++
    Par maarek dans le forum C++
    R�ponses: 6
    Dernier message: 29/08/2008, 18h40
  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, 16h23
  5. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    R�ponses: 20
    Dernier message: 05/01/2005, 19h15

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