je declare un tableau static const tab[x];
je declare un tableau static const tab[x];
je declare un tableau static const tab[x];
On Wed, 18 May 2005 21:57:04 +0200, Bruno Causse :je declare un tableau static const tab[x];
M'étonnerait... Les tableaux à la C doivent avoir une taille connue à
la compilation.
De plus, comme ton tableau est constant, tu n'es pas censé modifier
les données (i.e. tu ne peux pas le remplir)[*].
En prime, les données en question n'ont pas de type !
desolé :-)
En fait, tu peux faire un truc comme
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
Pour la plupart des autres cas, utilise std::vector<>.
Ainsi, si tu veux calculer à l'exécution les valeurs contenues :
std::vector<int> tab;
for (int i=0; i<12; ++i)
{
tab.push_back (42*i+22);
}
On Wed, 18 May 2005 21:57:04 +0200, Bruno Causse :
je declare un tableau static const tab[x];
M'étonnerait... Les tableaux à la C doivent avoir une taille connue à
la compilation.
De plus, comme ton tableau est constant, tu n'es pas censé modifier
les données (i.e. tu ne peux pas le remplir)[*].
En prime, les données en question n'ont pas de type !
desolé :-)
En fait, tu peux faire un truc comme
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
Pour la plupart des autres cas, utilise std::vector<>.
Ainsi, si tu veux calculer à l'exécution les valeurs contenues :
std::vector<int> tab;
for (int i=0; i<12; ++i)
{
tab.push_back (42*i+22);
}
On Wed, 18 May 2005 21:57:04 +0200, Bruno Causse :je declare un tableau static const tab[x];
M'étonnerait... Les tableaux à la C doivent avoir une taille connue à
la compilation.
De plus, comme ton tableau est constant, tu n'es pas censé modifier
les données (i.e. tu ne peux pas le remplir)[*].
En prime, les données en question n'ont pas de type !
desolé :-)
En fait, tu peux faire un truc comme
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
Pour la plupart des autres cas, utilise std::vector<>.
Ainsi, si tu veux calculer à l'exécution les valeurs contenues :
std::vector<int> tab;
for (int i=0; i<12; ++i)
{
tab.push_back (42*i+22);
}
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
oui mais je ne connais pas les valeurs.
un vector a les memes perfs qu'un tableau ?
les données peuvent etre constantes?
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
oui mais je ne connais pas les valeurs.
un vector a les memes perfs qu'un tableau ?
les données peuvent etre constantes?
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
oui mais je ne connais pas les valeurs.
un vector a les memes perfs qu'un tableau ?
les données peuvent etre constantes?
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
Deux solutions :
1) en ne le déclarant pas const.
2) en utilisant un (méta-)programme qui va créer un fichier où est
défini tab[] avec les bonnes valeurs d'initialisations.
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
Deux solutions :
1) en ne le déclarant pas const.
2) en utilisant un (méta-)programme qui va créer un fichier où est
défini tab[] avec les bonnes valeurs d'initialisations.
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
Deux solutions :
1) en ne le déclarant pas const.
2) en utilisant un (méta-)programme qui va créer un fichier où est
défini tab[] avec les bonnes valeurs d'initialisations.
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
bonsoir,
je declare un tableau static const tab[x];
comment le remplire? (ce sont des valeurs calculées)
J'ai peur de dire une bêtise parceque je sais qu'il faut rarement (jamais ?)
dériver des classes de la STL,
mais est ce qu'on est pas dans un cas "contre-exemple" :
struct MonTableauInitialise : public std::vector<int>
{
MonTableauInitialise()
: std::vector<int>(std::vector<int>::size_type(x), 0)
{
//Initialisation
}
}
static const MonTableauInitialise tab;
J'ai peur de dire une bêtise parceque je sais qu'il faut rarement (jamais ?)
dériver des classes de la STL,
mais est ce qu'on est pas dans un cas "contre-exemple" :
struct MonTableauInitialise : public std::vector<int>
{
MonTableauInitialise()
: std::vector<int>(std::vector<int>::size_type(x), 0)
{
//Initialisation
}
}
static const MonTableauInitialise tab;
J'ai peur de dire une bêtise parceque je sais qu'il faut rarement (jamais ?)
dériver des classes de la STL,
mais est ce qu'on est pas dans un cas "contre-exemple" :
struct MonTableauInitialise : public std::vector<int>
{
MonTableauInitialise()
: std::vector<int>(std::vector<int>::size_type(x), 0)
{
//Initialisation
}
}
static const MonTableauInitialise tab;
Fabien LE LEZ wrote:On Wed, 18 May 2005 21:57:04 +0200, Bruno Causse :je declare un tableau static const tab[x];
M'étonnerait... Les tableaux à la C doivent avoir une taille
connue à
la compilation.
oui, un peu rapide :-)
ex: static const int tab[42];De plus, comme ton tableau est constant, tu n'es pas censé
modifier les données (i.e. tu ne peux pas le remplir)[*].
voila mon probleme :(
donc il n'est pas possible d'avoir un tableau de constantes
aleatoires par exemple;
En prime, les données en question n'ont pas de type !
desolé :-)En fait, tu peux faire un truc comme
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
oui mais je ne connais pas les valeurs.
Pour la plupart des autres cas, utilise std::vector<>.
Ainsi, si tu veux calculer à l'exécution les valeurs
contenues :
std::vector<int> tab;
for (int i=0; i<12; ++i)
{
tab.push_back (42*i+22);
}
un vector a les memes perfs qu'un tableau ?
les données peuvent etre constantes?
Fabien LE LEZ <gramster@gramster.com> wrote:
On Wed, 18 May 2005 21:57:04 +0200, Bruno Causse :
je declare un tableau static const tab[x];
M'étonnerait... Les tableaux à la C doivent avoir une taille
connue à
la compilation.
oui, un peu rapide :-)
ex: static const int tab[42];
De plus, comme ton tableau est constant, tu n'es pas censé
modifier les données (i.e. tu ne peux pas le remplir)[*].
voila mon probleme :(
donc il n'est pas possible d'avoir un tableau de constantes
aleatoires par exemple;
En prime, les données en question n'ont pas de type !
desolé :-)
En fait, tu peux faire un truc comme
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
oui mais je ne connais pas les valeurs.
Pour la plupart des autres cas, utilise std::vector<>.
Ainsi, si tu veux calculer à l'exécution les valeurs
contenues :
std::vector<int> tab;
for (int i=0; i<12; ++i)
{
tab.push_back (42*i+22);
}
un vector a les memes perfs qu'un tableau ?
les données peuvent etre constantes?
Fabien LE LEZ wrote:On Wed, 18 May 2005 21:57:04 +0200, Bruno Causse :je declare un tableau static const tab[x];
M'étonnerait... Les tableaux à la C doivent avoir une taille
connue à
la compilation.
oui, un peu rapide :-)
ex: static const int tab[42];De plus, comme ton tableau est constant, tu n'es pas censé
modifier les données (i.e. tu ne peux pas le remplir)[*].
voila mon probleme :(
donc il n'est pas possible d'avoir un tableau de constantes
aleatoires par exemple;
En prime, les données en question n'ont pas de type !
desolé :-)En fait, tu peux faire un truc comme
static int const tab[]= { 3, 7, 42, 4654, 12, 132 };
oui mais je ne connais pas les valeurs.
Pour la plupart des autres cas, utilise std::vector<>.
Ainsi, si tu veux calculer à l'exécution les valeurs
contenues :
std::vector<int> tab;
for (int i=0; i<12; ++i)
{
tab.push_back (42*i+22);
}
un vector a les memes perfs qu'un tableau ?
les données peuvent etre constantes?
un vector a les memes perfs qu'un tableau ?
Ça dépend de l'implémentation. Et ce qu'on en fait --
typiquement, la création d'un vector est nettement moins rapide
que celle d'un tableau de type C, mais il ne doit pas y avoir
une grande différence lors des accès. Dans l'ensemble, si tu as
une petite classe, du genre :
class Point
{
std::vector< double > loc ; // Toujours trois éléments
// ...
} ;
et tu en crées des millions, la différence en performance par
rapport à double[ 3 ] risque d'être importante. Mais la plupart
du temps, ce n'est pas une motivation. Le profiler te dira.
La plupart du temps, quand on utilise les tableaux de type C,
c'est pour éviter des problèmes de l'ordre d'initialisation, ou
pour exploiter la syntaxe d'initialisation, quand même plus
simple à écrire et à comprendre que celle d'un std::vector.
les données peuvent etre constantes?
Si le std::vector est const, les données sont const. Le
problème, c'est l'initialisation. Dans la pratique, à peu près
la seule initialisation intéressante pour un std::vector const,
c'est celui à deux itérateurs :
std::vector< int > const myValues( init.begin(), init.end() ) ;
Mais ça ne fait que répousser le problème ; on finit avec
quelque chose comme :
static int const init[] = { 1, 1, 2, 3, 5 } ;
std::vector< int > const v( init, init + 5 ) ;
et alors, pourquoi le std::vector ?
Note que ce genre de chose est bien intéressant si on a un
std::set ou un std::map. J'ai beaucoup de code du genre :
typedef std::map< std::string, MyClass > Map ;
struct MapInit
{
char const* key ;
int a ;
int b ;
operator Map::value_type() const
{
return Map::value_type(
std::string( key ),
MyClass( a, b ) ) ;
}
} ;
MapInit const init[] > {
{ "a1b1", 1, 1 },
{ "a2b5", 2, 5 },
// ...
}
Map const map( begin( init ), end( init ) ) ;
Strictement parlant, j'aurais pû me passer aussi de map, et fait
une récherche linéaire sur init (au moyen de std::find,
évidemment). Mais l'utilisation de std::map est plus intuitive,
une fois le map construit, même si c'est parfois un peu moins
vite, parce que je n'hésite pas à m'en servir, même quand le map
ne contient que trois ou quatre éléments -- à partir d'une
dizaine d'éléments, std::map devient nettement plus rapide, et à
partir d'une centaine de millier (ce qui suppose une génération
automatique du tableau d'initialisation), si les performances
sont critiques, il faut remplacer std::map par un tableau haché.
--
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
un vector a les memes perfs qu'un tableau ?
Ça dépend de l'implémentation. Et ce qu'on en fait --
typiquement, la création d'un vector est nettement moins rapide
que celle d'un tableau de type C, mais il ne doit pas y avoir
une grande différence lors des accès. Dans l'ensemble, si tu as
une petite classe, du genre :
class Point
{
std::vector< double > loc ; // Toujours trois éléments
// ...
} ;
et tu en crées des millions, la différence en performance par
rapport à double[ 3 ] risque d'être importante. Mais la plupart
du temps, ce n'est pas une motivation. Le profiler te dira.
La plupart du temps, quand on utilise les tableaux de type C,
c'est pour éviter des problèmes de l'ordre d'initialisation, ou
pour exploiter la syntaxe d'initialisation, quand même plus
simple à écrire et à comprendre que celle d'un std::vector.
les données peuvent etre constantes?
Si le std::vector est const, les données sont const. Le
problème, c'est l'initialisation. Dans la pratique, à peu près
la seule initialisation intéressante pour un std::vector const,
c'est celui à deux itérateurs :
std::vector< int > const myValues( init.begin(), init.end() ) ;
Mais ça ne fait que répousser le problème ; on finit avec
quelque chose comme :
static int const init[] = { 1, 1, 2, 3, 5 } ;
std::vector< int > const v( init, init + 5 ) ;
et alors, pourquoi le std::vector ?
Note que ce genre de chose est bien intéressant si on a un
std::set ou un std::map. J'ai beaucoup de code du genre :
typedef std::map< std::string, MyClass > Map ;
struct MapInit
{
char const* key ;
int a ;
int b ;
operator Map::value_type() const
{
return Map::value_type(
std::string( key ),
MyClass( a, b ) ) ;
}
} ;
MapInit const init[] > {
{ "a1b1", 1, 1 },
{ "a2b5", 2, 5 },
// ...
}
Map const map( begin( init ), end( init ) ) ;
Strictement parlant, j'aurais pû me passer aussi de map, et fait
une récherche linéaire sur init (au moyen de std::find,
évidemment). Mais l'utilisation de std::map est plus intuitive,
une fois le map construit, même si c'est parfois un peu moins
vite, parce que je n'hésite pas à m'en servir, même quand le map
ne contient que trois ou quatre éléments -- à partir d'une
dizaine d'éléments, std::map devient nettement plus rapide, et à
partir d'une centaine de millier (ce qui suppose une génération
automatique du tableau d'initialisation), si les performances
sont critiques, il faut remplacer std::map par un tableau haché.
--
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
un vector a les memes perfs qu'un tableau ?
Ça dépend de l'implémentation. Et ce qu'on en fait --
typiquement, la création d'un vector est nettement moins rapide
que celle d'un tableau de type C, mais il ne doit pas y avoir
une grande différence lors des accès. Dans l'ensemble, si tu as
une petite classe, du genre :
class Point
{
std::vector< double > loc ; // Toujours trois éléments
// ...
} ;
et tu en crées des millions, la différence en performance par
rapport à double[ 3 ] risque d'être importante. Mais la plupart
du temps, ce n'est pas une motivation. Le profiler te dira.
La plupart du temps, quand on utilise les tableaux de type C,
c'est pour éviter des problèmes de l'ordre d'initialisation, ou
pour exploiter la syntaxe d'initialisation, quand même plus
simple à écrire et à comprendre que celle d'un std::vector.
les données peuvent etre constantes?
Si le std::vector est const, les données sont const. Le
problème, c'est l'initialisation. Dans la pratique, à peu près
la seule initialisation intéressante pour un std::vector const,
c'est celui à deux itérateurs :
std::vector< int > const myValues( init.begin(), init.end() ) ;
Mais ça ne fait que répousser le problème ; on finit avec
quelque chose comme :
static int const init[] = { 1, 1, 2, 3, 5 } ;
std::vector< int > const v( init, init + 5 ) ;
et alors, pourquoi le std::vector ?
Note que ce genre de chose est bien intéressant si on a un
std::set ou un std::map. J'ai beaucoup de code du genre :
typedef std::map< std::string, MyClass > Map ;
struct MapInit
{
char const* key ;
int a ;
int b ;
operator Map::value_type() const
{
return Map::value_type(
std::string( key ),
MyClass( a, b ) ) ;
}
} ;
MapInit const init[] > {
{ "a1b1", 1, 1 },
{ "a2b5", 2, 5 },
// ...
}
Map const map( begin( init ), end( init ) ) ;
Strictement parlant, j'aurais pû me passer aussi de map, et fait
une récherche linéaire sur init (au moyen de std::find,
évidemment). Mais l'utilisation de std::map est plus intuitive,
une fois le map construit, même si c'est parfois un peu moins
vite, parce que je n'hésite pas à m'en servir, même quand le map
ne contient que trois ou quatre éléments -- à partir d'une
dizaine d'éléments, std::map devient nettement plus rapide, et à
partir d'une centaine de millier (ce qui suppose une génération
automatique du tableau d'initialisation), si les performances
sont critiques, il faut remplacer std::map par un tableau haché.
--
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
dans l'article
,
à a écrit le 19/05/05
9:49 :La plupart du temps, quand on utilise les tableaux de type
C, c'est pour éviter des problèmes de l'ordre
d'initialisation, ou pour exploiter la syntaxe
d'initialisation, quand même plus simple à écrire et à
comprendre que celle d'un std::vector.
Faut il utiliser (recommander) vector en lieu et place d'un
simple tableau (dans le cas ou seul l'indexage "cad []" est
utilisé)
Remarques : je ne me pose pas la question avec string et
char*.
Note que ce genre de chose est bien intéressant si on a un
std::set ou un std::map. J'ai beaucoup de code du genre :
typedef std::map< std::string, MyClass > Map ;
struct MapInit
{
char const* key ;
Tiens et pourquoi pas la classe string?
dans l'article
1116488970.900403.177450@g43g2000cwa.googlegroups.com,
kanze@gabi-soft.fr à kanze@gabi-soft.fr a écrit le 19/05/05
9:49 :
La plupart du temps, quand on utilise les tableaux de type
C, c'est pour éviter des problèmes de l'ordre
d'initialisation, ou pour exploiter la syntaxe
d'initialisation, quand même plus simple à écrire et à
comprendre que celle d'un std::vector.
Faut il utiliser (recommander) vector en lieu et place d'un
simple tableau (dans le cas ou seul l'indexage "cad []" est
utilisé)
Remarques : je ne me pose pas la question avec string et
char*.
Note que ce genre de chose est bien intéressant si on a un
std::set ou un std::map. J'ai beaucoup de code du genre :
typedef std::map< std::string, MyClass > Map ;
struct MapInit
{
char const* key ;
Tiens et pourquoi pas la classe string?
dans l'article
,
à a écrit le 19/05/05
9:49 :La plupart du temps, quand on utilise les tableaux de type
C, c'est pour éviter des problèmes de l'ordre
d'initialisation, ou pour exploiter la syntaxe
d'initialisation, quand même plus simple à écrire et à
comprendre que celle d'un std::vector.
Faut il utiliser (recommander) vector en lieu et place d'un
simple tableau (dans le cas ou seul l'indexage "cad []" est
utilisé)
Remarques : je ne me pose pas la question avec string et
char*.
Note que ce genre de chose est bien intéressant si on a un
std::set ou un std::map. J'ai beaucoup de code du genre :
typedef std::map< std::string, MyClass > Map ;
struct MapInit
{
char const* key ;
Tiens et pourquoi pas la classe string?