Std::sort

cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008 - 19 nov. 2004 à 22:45
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 21 nov. 2004 à 20:35
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

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 nov. 2004 à 23:04
std::sort (tmpo.begin (), tmpo.begin () + 7);
0
cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008
19 nov. 2004 à 23:11
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@
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 nov. 2004 à 23:26
il dit quoi le debugger ?

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

> std::vector tmpo(Pos.size());;
0
cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008
19 nov. 2004 à 23:34
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@
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 nov. 2004 à 23:44
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();
}

}
0
cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008
19 nov. 2004 à 23:53
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@
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 nov. 2004 à 00:00
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é
0
cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008
20 nov. 2004 à 00:07
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@
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 nov. 2004 à 00:12
c'est quel ligne qui plante ?
0
cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008
20 nov. 2004 à 11:30
c'est entre le début du premier for et la fin du premier je n'en sait pas plus
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 nov. 2004 à 11:54
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
0
cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008
20 nov. 2004 à 17:38
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@
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
21 nov. 2004 à 17:09
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
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 nov. 2004 à 17:36
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 ?
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
21 nov. 2004 à 17:56
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...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 nov. 2004 à 18:41
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;
}
}
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
21 nov. 2004 à 20:35
ouah... ben je vais cogiter un peu sur tout ca,hein...
merci...
0
Rejoignez-nous