Std::sort

Signaler
Messages postés
170
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
9 juillet 2008
-
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Bonjours

Voici une partit de mon programme :

std::vector Index;
std::vector Pos;

.
.
.

void OrgaIndex ( void )
{
std::vector tmpo;
tmpo.resize(Pos.size());
std::copy(Pos.begin(),Pos.end(),tmpo.begin());
std::sort (tmpo.begin (), tmpo.begin () + 7, tmpo.end ());
for ( int i = 0; i < Pos.size(); i++ )
{
for ( int t = 0; t < Pos.size() ; t++ )
{
if ( tmpo[i] == Pos[t] ) Index[i] = t;
}
}
}

Au cour de mon programme la taille de Pos change mais la taille de Pos est toujours la meme que celle de Index.

en fait j'ai un ntableau Pos rempli de différentes valeur et je charge a rentrer dans Index l'ordre croissant de Pos.

je m'explique :

si Pos est constitué comme cela :
Pos[0] = 300
Pos[1] = 100
Pos[2] = 400
alors je veut que Index soit comme cela :
Index[0] = 1
Index[1] = 0
Index[2] = 2

voila sauf que ma fonction quand je l'appelle et si Pos comporte au moin une valeur , la fonction plante et fin du programme :(

Ou ai-je fait une erreur ??

Merci

KiRu@

17 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
std::sort (tmpo.begin (), tmpo.begin () + 7);
Messages postés
170
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
9 juillet 2008

oui en fait g modif vite fait car javai mis partial mais sa avait pas fat de changement mais meme en mettant

std::sort (tmpo.begin (), tmpo.begin () + 7);

sa plante tjr autant

KiRu@
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
il dit quoi le debugger ?

std::vector tmpo;
tmpo.resize(Pos.size());

> std::vector tmpo(Pos.size());;
Messages postés
170
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
9 juillet 2008

le débogguer me dir rien aucune prob

le prob c'est quand jexécute la fonction et qu'il y a au moin 1 valeur dans Pos

std::vector tmpo;
tmpo.resize(Pos.size());

j'ai utiliser ce system car au début j'avai écrit

int tmpo[Pos.size()];
tmpo = Pos;

mais sa ne marchai pas car Pos au début ya rien dedans

Le prob vient d'autre part

KiRu@
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
c'est ce que tu ve faire ? (à verifier)

void OrgaIndex ( void )
{
std::vector tmpo( Pos );

std::sort (tmpo.begin (), tmpo.end());

for( std::vector::size_type i = 0; i < Pos.size(); ++i )
{
index[i] = std::find( tmpo.begin(), tmpo.end(), Pos[i] ) - tmpo.begin();
}

}
Messages postés
170
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
9 juillet 2008

je ne conné pas std::vector::size_type peut tu me l'expliquer ?

et au fait tmpo.begin() renvoi quoi ?? un pointeur ?? si c'est un pointeur ce n'est pas bon

KiRu@
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ca renvoi un iterateur mais la difference sera converti en size_type

size_type est un type membre de vector, il sert de type exprimant une taille (size(), operator[],...)

vector parce qu'il faut un type de vector instancié
Messages postés
170
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
9 juillet 2008

en fait ton code ne me vas pas.

en fouillant mon code c'était une erreur mais il y en a une autre et je suis sur quel est dans la focntion et plus particulierement dans la double boucle for :

void OrgaIndex ( void )
{
std::vector tmpo( Pos );

std::sort (tmpo.begin (), tmpo.end());

for ( int i = 0; i < Index.size(); i++ )
{
for ( int t = 0; t < Pos.size() ; t++ )
{
if ( tmpo[i] == Pos[t] ) Index[i] = t;
}
}

}

Ou est le probleme ? la seul erreur a laquel je pense c'est une erreur d'écriture dans une variable inéxistante mais je n'est pas de message d'eeruer : le mémoire ne peut etre written

KiRu@
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
c'est quel ligne qui plante ?
Messages postés
170
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
9 juillet 2008

c'est entre le début du premier for et la fin du premier je n'en sait pas plus
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
le debugger dit à quel lit ca plante ?

ya rien d'anormal à priori dans les deux boucle, t'es sur que ca vient pas d'ailleur ?

pour t'en assurer fais un Index.resize( Pos.size() ); avant les for
Messages postés
170
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
9 juillet 2008

le debug ne dit rien danormale

moi aussi apriori les boucle sont bonne

le resize ne change rien

va faloir que j'arrive a trouver mais la je par en week end

a plus KiRu@
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
j'ai une question a propos de cette fonction.
je veux classer un tableau en fonction d'un autre tableau.on peut le faire avec ca?
exemple, j'ai
a[]={0,1,2,3,4,5};
b[]={9,8,7,5,6,4};
et je veux que a[5] se retrouve en premiere position, puisque b[5] est le plus petit. ensuite viendraient a[3],a[4],a[2],a[1],a[0]
c'est possible?
merci
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
le plus simple c'est d'agréger a et b

struct s
{
int a,b;

bool operator<( const s & o)
{
return b<o.b;
}

// et autres operateurs necessaires

};

// un tableau
std::vector<s> v;

// initialisation

// tri selon b
std::sort( v.begin(), v.end() );

a moins que tu preferes avoir 2 tableaux distincts, pour que les elements soient contigues en memoire ?
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
bona vrai dire c'est pas tout a fait ca que j'ai.
struct _particule{
float distance;
....
};
_particule Particule[1000];
la je créé 1000 particules; le but est de créer un tableau
int ordre[1000];
ordre[0] contient l'index de la particule la plus lointaine, par exemple la
100eme, soit ordre[0]==100, et ainsi de suite.
apres pour afficher les particules, je fais
for (int a=0;a!=1000;a++){
drawparticule[Particule[ordre[a]];
}

vi je sais c'est compliqué, t'as peut-etre une autre méthode, le pb c'est que la transparence c'est chiant, il faut dessiner en premier les plus lointains...
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
je ferais comme ca, et je sais pas si ya plus rapide ??

// les entetes necessaires
#include
#include
#include <vector>

// à eviter dans un header
using namespace std;

struct _particule
{

float distance;
...

// operator< pour le tri (selon la distance)
bool operator< (const _particule & o ) const
{
return distance<o.distance;
}
};

// le tableau de particule
_particule Particule[1000];

// le nombre de particule
const size_t Particule_size = sizeof Particule / sizeof Particule[0];
// le tableau d'indices
size_t ordre[Particule_size];

// affecte l'odre au tableau order
void SetOrder( const _particule (&particules)[Particule_size], size_t (&order)[Particule_size] )
{
vector > v_i(Particule_size);
for( size_t i = 0; i < Particule_size; ++i )
{
v_i[i].first = particules[i];
v_i[i].second = i;
}

sort( v_i.begin(), v_i.end() );

for( size_t i = 0; i < Particule_size; ++i )
{
order[i] = v_i[i].second;
}
}
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
ouah... ben je vais cogiter un peu sur tout ca,hein...
merci...