|
|
|
|
Bonsoir,
j'aimerais faire un tri d'un tableau contenant des types point composé de x (ordonné) et de t (le temps), et j'aimerais trier le tableau efficacement
en ordre croissant en fonction de t plus précisément trier le tableau pointé par pv. voici mon code dont je vous épargne son intégralité
Merci d'avance
class Point {
public:
double x, t;
Point( double x = 0.0, double t= 1) : x(x), t(t) {}
friend Point milieu( const Point & p, const Point & q);
friend Point gauss2D( const Point & moy = Point(), double sig2 = 1.0);
};
struct Brown2D {
Point q;
Brown2D *s;
};
Point milieu( const Point & p, const Point & q) {
double x = (p.x + q.x)/2.0;
double t = (p.t + q.t)/2.0;
return Point(x,t);
}
int main() {
srand( time(0));
Brown2D B1 = { Point(gauss2D()), 0 },//considérer B1 et B0
B0 = { Point(0,0), &B1 };//comme despoints
Brown2D *pg, *pm, *pd; // pointeurs gauche, milieu, droite
int N=3;
Point *pv=new Point [N];
pv[0]=Point(0,0);
pv[N-1]=B1.q;
for ( int n = 1 ; n < N ; n ++ ) {
for ( pg = &B0 ; pd = pg->s ; pg = pd ) {
pm = new Brown2D;
pm->q = gauss2D( milieu( pg->q, pd->q),
abs(pd->q.t - pg->q.t)/4);
pv[n]=Point(pm->q.x,pm->q.t);//ici pv prend tous les points(x,t) mais dans le desordre
pm->s = pg->s;
pg->s = pm;
pm->q.plot();
}
}
}
Configuration: Windows XP Firefox 2.0
Il faut redéfinir l'opérateur < sur ta classe point ou définir un foncteur.
#include <set>
#include <iostream>
class Point{
public:
double x,t;
Point(const double & x0,const double & t0):x(x0),t(t0){}
//...
};
struct cmp_time{
inline bool operator()(const Point & p1,const Point & p2){
return p1.t < p2.t || (p1.t == p2.t && p1.x < p2.x);
}
}
int main(){
// Construire l'ensemble de points ordonnés sur le temps
Point p1(3,5),p2(7,2),p3(6,9);
std::set<Point,cmp_time> ens_pts;
ens_pts.insert(p1);
ens_pts.insert(p2);
ens_pts.insert(p3);
// Afficher l'ensemble de poitns
std::set<Point,cmp_time>::const_iterator
sit(ens_pts.begin()),send(ens_pts.end())
for(;sit!=send;++sit){
const Point & pcur = *sit;
std::cout << pcur.x << '\t' << pcur.t << std::endl;
}
return 0;
}
Par defaut si le comparateur du set n'est pas spécifié, on utilise le foncteur par défaut qui repose sur le relation < (ici celle de la classe Point). Dans ton cas il faudrait définir l'opérateur < pour pouvoir écrire directement : std::set<Point> Exemple : ...
inline bool operator<(const Point & p1,const Point & p2){
return p1.t < p2.t || (p1.t == p2.t && p1.x < p2.x);
}
int main(){
std::set<Poiont> ens_points2;
//...
return 0;
}
Bonne chance |
Je pense qu'il y a plus simple
|