 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
horneta2005@yahoo.fr Guest
|
Posted: Thu Sep 29, 2005 8:50 pm Post subject: tri de tableau |
|
|
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+ me donne 2 le tableau le plus petit
Merci de votre aide
|
|
| Back to top |
|
 |
SerGioGio Guest
|
Posted: Fri Sep 30, 2005 7:26 pm Post subject: Re: tri de tableau |
|
|
| 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+ 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
|
Posted: Fri Sep 30, 2005 7:58 pm Post subject: Re: tri de tableau |
|
|
merci pour t on aide
je vais essayer d utiliser t on code pour
mon programme
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Mon Oct 03, 2005 8:28 am Post subject: Re: tri de tableau |
|
|
[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+ 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 |
|
 |
|
|
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
|
|