C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

tri de tableau

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
horneta2005@yahoo.fr
Guest





PostPosted: Thu Sep 29, 2005 8:50 pm    Post subject: tri de tableau Reply with quote




Voila j'ai un tableau de DIM 2 (unsigned int Tab[9][9])
je voudrais ecrire un bout de code (STL OU PAS) permettant de disposer
d un pointeur PtTab qui donne acces a TAB mais de maniere trier par
ordre decroissant.je m'explique
exemple:

Tab[0][0-8]={2,1,3,5,9,6,7,8,4} 8
Tab[1][0-8]={7,4,8,5,9,6,1,2,3} 5
Tab[2][0-8]={1,4,8,5,9,6,7,2,3} 9 (le plus petit)
Tab[3][0-8]={6,9,8,5,1,4,7,2,3} 6
Tab[4][0-8]={4,1,8,5,9,6,7,2,3} 7
Tab[5][0-8]={9,8,6,5,7,3,1,2,4} 1 (le plus grand )
Tab[6][0-8]={8,6,4,5,9,1,7,2,3} 4
Tab[7][0-8]={9,7,8,5,4,6,2,1,3} 2
Tab[8][0-8]={8,9,4,1,5,6,7,2,3} 3

je voudrais juste un pointeur qui me donne:
*PtTab me donne 5 (indice du tableau le plus grand)
PtTab++//j' incremente le pointeur
*PtTab me donne 7 (indice du tableau juste en dessous) etc...
*(PtTab+Cool me donne 2 le tableau le plus petit

Merci de votre aide

Back to top
SerGioGio
Guest





PostPosted: Fri Sep 30, 2005 7:26 pm    Post subject: Re: tri de tableau Reply with quote




Quote:
Voila j'ai un tableau de DIM 2 (unsigned int Tab[9][9])
je voudrais ecrire un bout de code (STL OU PAS) permettant de disposer
d un pointeur PtTab qui donne acces a TAB mais de maniere trier par
ordre decroissant.je m'explique
exemple:

Tab[0][0-8]={2,1,3,5,9,6,7,8,4} 8
Tab[1][0-8]={7,4,8,5,9,6,1,2,3} 5
Tab[2][0-8]={1,4,8,5,9,6,7,2,3} 9 (le plus petit)
Tab[3][0-8]={6,9,8,5,1,4,7,2,3} 6
Tab[4][0-8]={4,1,8,5,9,6,7,2,3} 7
Tab[5][0-8]={9,8,6,5,7,3,1,2,4} 1 (le plus grand )
Tab[6][0-8]={8,6,4,5,9,1,7,2,3} 4
Tab[7][0-8]={9,7,8,5,4,6,2,1,3} 2
Tab[8][0-8]={8,9,4,1,5,6,7,2,3} 3

je voudrais juste un pointeur qui me donne:
*PtTab me donne 5 (indice du tableau le plus grand)
PtTab++//j' incremente le pointeur
*PtTab me donne 7 (indice du tableau juste en dessous) etc...
*(PtTab+Cool me donne 2 le tableau le plus petit

On note M le nombre de lignes de ton yableau, N le nombre de colonnes.
Voici une ébauche de suggestion:
1- créer le tableau PtTab, et le remplir de 0 à (M-1) dans l'ordre
croissant. A ma connaissance, la STL n'aide pas ici, donc tout bêtement:
int ptTab[M];
for(int i = 0 ; i < M ; ++i) ptTab[i] = i;

2- utiliser std::sort pour ordonner le tableau, en utilisant un comparator
spécial:
std::sort(ptTab, ptTab + M, comparator());

le comparator spécial est le suivant:
struct comparator
{
bool operator()(int lhs, int rhs)
{
const int* p = Tab[lhs], * q = Tab[rhs];
while((p - Tab[lhs] < M) && (*p == *q)) p++, q++;
return (*p > *q);
}
};


Bon courage,

SerGioGioGio



Back to top
horneta2005@yahoo.fr
Guest





PostPosted: Fri Sep 30, 2005 7:58 pm    Post subject: Re: tri de tableau Reply with quote



merci pour t on aide
je vais essayer d utiliser t on code pour
mon programme

Back to top
kanze
Guest





PostPosted: Mon Oct 03, 2005 8:28 am    Post subject: Re: tri de tableau Reply with quote

[email]horneta2005 (AT) yahoo (DOT) fr[/email] wrote:

Quote:
Voila j'ai un tableau de DIM 2 (unsigned int Tab[9][9]) je
voudrais ecrire un bout de code (STL OU PAS) permettant de
disposer d un pointeur PtTab qui donne acces a TAB mais de
maniere trier par ordre decroissant.je m'explique
exemple:

Tab[0][0-8]={2,1,3,5,9,6,7,8,4} 8
Tab[1][0-8]={7,4,8,5,9,6,1,2,3} 5
Tab[2][0-8]={1,4,8,5,9,6,7,2,3} 9 (le plus petit)
Tab[3][0-8]={6,9,8,5,1,4,7,2,3} 6
Tab[4][0-8]={4,1,8,5,9,6,7,2,3} 7
Tab[5][0-8]={9,8,6,5,7,3,1,2,4} 1 (le plus grand )
Tab[6][0-8]={8,6,4,5,9,1,7,2,3} 4
Tab[7][0-8]={9,7,8,5,4,6,2,1,3} 2
Tab[8][0-8]={8,9,4,1,5,6,7,2,3} 3

Si tu mets les données dans un
std::vector< std::vector< int > >
, std::sort marche directement. Sinon, c'est un peu compliqué du
fait que les tableaux de type C ne sont pas de vrais objets : le
type contenu dans le tableau est int[9]. Et un int[9] n'est ni
CopyConstructable, ni Assignable, ce qui veut dire que les
algorithms comme sort ne peut pas l'utiliser comme value_type de
l'iterateur.

(En fait, la norme est un peu vague à cet égard ; je n'ai pas
réussi à trouver des restrictions sur le value_type d'un
itérateur. Mais il me semble évident que pour que sort marche,
il faut que le type soit CopyConstructable et Assignable.)

Quote:
je voudrais juste un pointeur qui me donne:
*PtTab me donne 5 (indice du tableau le plus grand)
PtTab++//j' incremente le pointeur
*PtTab me donne 7 (indice du tableau juste en dessous) etc...
*(PtTab+Cool me donne 2 le tab

Encore plus simple, d'un côté, parce que ce que tu tries est un
tableau d'entiers, ce qui évite le problème d'un value_type qui
est un tableau. En revanche, il va falloir que tu fournisses un
opérateur de comparaison. Quelque chose du genre :

template< typename T, size_t N, size_t M >
class IndexedCmp
{
public:
explicit IndexedCmp( T const table[ N ][ M ] )
: myTable( table )
{
}
bool operator()( size_t lhs, size_t rhs ) const
{
assert( lhs < N && rhs < N ) ;
std::pair< T const*, T const* >
r
= std::mismatch( begin( myTable[ lhs ] ),
end( myTable[ lhs ] ),
begin( myTable[ rhs ] ) ) ;
return r.first != end( myTable[ lhs ] ) && *r.first <
*r.second ;
}
private:
T const (* myTable)[ M ] ;
} ;

template< typename T, size_t N, size_t M >
inline IndexedCmp< T, N, M >
getIndexedCmp(
T const (& table)[ N ][ M ] )
{
return IndexedCmp< T, N, M >( table ) ;
}

La fonction libre permet de profitter de la déduction des
types ; on peut donc écrire simplement :

int const t0[ 9 ][ 9 ] =
{
{2,1,3,5,9,6,7,8,4},
{7,4,8,5,9,6,1,2,3},
{1,4,8,5,9,6,7,2,3},
{6,9,8,5,1,4,7,2,3},
{4,1,8,5,9,6,7,2,3},
{9,8,6,5,7,3,1,2,4},
{8,6,4,5,9,1,7,2,3},
{9,7,8,5,4,6,2,1,3},
{8,9,4,1,5,6,7,2,3},
} ;

std::vector< int > t1( boost::counting_iterator< int >( 0 ),
boost::counting_iterator< int >( 9 ) ) ;
std::sort( t1.begin() , t1.end(), getIndexedCmp( t0 ) ) ;

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.