est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
for(tList_A::const_iterator iter_list = my_list.begin(); iter_list !=
my_list.end(); iter_list++)
tab[...] = *iter_list;
}
my_map.clear(); //on efface tout
}
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
for(tList_A::const_iterator iter_list = my_list.begin(); iter_list !=
my_list.end(); iter_list++)
tab[...] = *iter_list;
}
my_map.clear(); //on efface tout
}
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
for(tList_A::const_iterator iter_list = my_list.begin(); iter_list !=
my_list.end(); iter_list++)
tab[...] = *iter_list;
}
my_map.clear(); //on efface tout
}
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
Mais il ne serait pas mal que tu nous expliques exactement ce
que tu essaies de faire. Parce que ce que tu nous montre à l'air
un peu lourd.
Dans la pratique, std::map ne copie ni n'affecte les éléments
une fois qu'ils y sont. Il m'est arrivé donc d'utiliser des
std::map< xxx, std::map > ou des std::map< xxx, std::vector >
sans trop de problèmes de lourdeur, en m'assurant que j'insérais
toujours un map ou un vecteur vide, et que j'insérais ensuite
dans l'élément dans le map. Typiquement, avec quelque chose du
genre :
map[ xxx ].push_back( nouvelElement ) ;
ou
map[ xxx ].insert( SubmapType::value_type( yyy, zzz ) ) ;
Je ne suis pas un acharné sur les performance, loin de ça, mais
je n'aime pas trop l'idée d'une copie profonde d'une std::list.
(J'ai eu le cas, une fois, où j'avais une fonction qui renvoyait
mon équivalent pré-norme d'une std::list, avec 60000 éléments.
Ça prenait à peu près 20 sécondes sur la machine à l'époque. Vue
que je ne le faisais que 4 fois dans une application qui
tournait bien plus de trois quarts d'heures, ce n'était pas
grave, mais ça donne à penser quand même.)
Mais il ne serait pas mal que tu nous expliques exactement ce
que tu essaies de faire. Parce que ce que tu nous montre à l'air
un peu lourd.
Dans la pratique, std::map ne copie ni n'affecte les éléments
une fois qu'ils y sont. Il m'est arrivé donc d'utiliser des
std::map< xxx, std::map > ou des std::map< xxx, std::vector >
sans trop de problèmes de lourdeur, en m'assurant que j'insérais
toujours un map ou un vecteur vide, et que j'insérais ensuite
dans l'élément dans le map. Typiquement, avec quelque chose du
genre :
map[ xxx ].push_back( nouvelElement ) ;
ou
map[ xxx ].insert( SubmapType::value_type( yyy, zzz ) ) ;
Je ne suis pas un acharné sur les performance, loin de ça, mais
je n'aime pas trop l'idée d'une copie profonde d'une std::list.
(J'ai eu le cas, une fois, où j'avais une fonction qui renvoyait
mon équivalent pré-norme d'une std::list, avec 60000 éléments.
Ça prenait à peu près 20 sécondes sur la machine à l'époque. Vue
que je ne le faisais que 4 fois dans une application qui
tournait bien plus de trois quarts d'heures, ce n'était pas
grave, mais ça donne à penser quand même.)
Mais il ne serait pas mal que tu nous expliques exactement ce
que tu essaies de faire. Parce que ce que tu nous montre à l'air
un peu lourd.
Dans la pratique, std::map ne copie ni n'affecte les éléments
une fois qu'ils y sont. Il m'est arrivé donc d'utiliser des
std::map< xxx, std::map > ou des std::map< xxx, std::vector >
sans trop de problèmes de lourdeur, en m'assurant que j'insérais
toujours un map ou un vecteur vide, et que j'insérais ensuite
dans l'élément dans le map. Typiquement, avec quelque chose du
genre :
map[ xxx ].push_back( nouvelElement ) ;
ou
map[ xxx ].insert( SubmapType::value_type( yyy, zzz ) ) ;
Je ne suis pas un acharné sur les performance, loin de ça, mais
je n'aime pas trop l'idée d'une copie profonde d'une std::list.
(J'ai eu le cas, une fois, où j'avais une fonction qui renvoyait
mon équivalent pré-norme d'une std::list, avec 60000 éléments.
Ça prenait à peu près 20 sécondes sur la machine à l'époque. Vue
que je ne le faisais que 4 fois dans une application qui
tournait bien plus de trois quarts d'heures, ce n'était pas
grave, mais ça donne à penser quand même.)
Personnellement, j'aimerais savoir d'où vient ces list, et
régarder si je ne pourrais pas les construire in situ,
directement dans la map. C-à-d quelque chose du genre :
std::list<A>& tmp = my_map[ hash_code ] ;
tmp.clear() ;
tmp.push_back( ... ) ;
// ...
Personnellement, j'aimerais savoir d'où vient ces list, et
régarder si je ne pourrais pas les construire in situ,
directement dans la map. C-à-d quelque chose du genre :
std::list<A>& tmp = my_map[ hash_code ] ;
tmp.clear() ;
tmp.push_back( ... ) ;
// ...
Personnellement, j'aimerais savoir d'où vient ces list, et
régarder si je ne pourrais pas les construire in situ,
directement dans la map. C-à-d quelque chose du genre :
std::list<A>& tmp = my_map[ hash_code ] ;
tmp.clear() ;
tmp.push_back( ... ) ;
// ...
Attention long long n'est pas standard.
[...]
Attention long long n'est pas standard.
[...]
Attention long long n'est pas standard.
[...]
est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
for(tList_A::const_iterator iter_list = my_list.begin(); iter_list !=
my_list.end(); iter_list++)
tab[...] = *iter_list;
}
my_map.clear(); //on efface tout
}
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
for(tList_A::const_iterator iter_list = my_list.begin(); iter_list !=
my_list.end(); iter_list++)
tab[...] = *iter_list;
}
my_map.clear(); //on efface tout
}
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
est que cette conception est valide (pseudo code c++)
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
for(tList_A::const_iterator iter_list = my_list.begin(); iter_list !=
my_list.end(); iter_list++)
tab[...] = *iter_list;
}
my_map.clear(); //on efface tout
}
la gestion des "copies des objets A" (creation, supression, copie, ...) la
stl s'en charge?
y a-t-il un moyen de déclarer un
entier 64 bits de manière standard ?
y a-t-il un moyen de déclarer un
entier 64 bits de manière standard ?
y a-t-il un moyen de déclarer un
entier 64 bits de manière standard ?
"Bruno Causse" écrivait:est que cette conception est valide (pseudo code c++)
Seul du non-pseudo code peut-être valide.typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
Attention long long n'est pas standard.
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
Une copie ? Ça n'a pas de sens ! où sont le "front" et le "back" d'un arbre,
une std::map<> ?
Ce que tu veux c'est, par exemple :
my_map[has_code]= my_list;
Pour éviter la copie tu écris :
tList_A & my_list(my_map[has_code]);
my_list.clear(); // *Do not* chack my_list.size()
initialise(my_list, hash_code);
avec initialise qui prends une référence sur un(e) tList_A.
Le plus simple :
my_map[has_code]= initialise(hash_code);
avec initialise qui retourne un(e) tList_A.
Y'a-t-il copie ? Ça dépend ! mais qu'importe.
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
ou tMap_A::iterator const iter_map(my_map.find(hash_code));if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
ou tList_A const & my_list(iter_map->second);
La syntaxe d'initialisation utilisant le symbole = implique une copie.
"Bruno Causse" <bcau...@lepoint.tm.fr> écrivait:
est que cette conception est valide (pseudo code c++)
Seul du non-pseudo code peut-être valide.
typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
Attention long long n'est pas standard.
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
Une copie ? Ça n'a pas de sens ! où sont le "front" et le "back" d'un arbre,
une std::map<> ?
Ce que tu veux c'est, par exemple :
my_map[has_code]= my_list;
Pour éviter la copie tu écris :
tList_A & my_list(my_map[has_code]);
my_list.clear(); // *Do not* chack my_list.size()
initialise(my_list, hash_code);
avec initialise qui prends une référence sur un(e) tList_A.
Le plus simple :
my_map[has_code]= initialise(hash_code);
avec initialise qui retourne un(e) tList_A.
Y'a-t-il copie ? Ça dépend ! mais qu'importe.
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
ou tMap_A::iterator const iter_map(my_map.find(hash_code));
if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
ou tList_A const & my_list(iter_map->second);
La syntaxe d'initialisation utilisant le symbole = implique une copie.
"Bruno Causse" écrivait:est que cette conception est valide (pseudo code c++)
Seul du non-pseudo code peut-être valide.typedef std::list < A > tList_A;
typedef std::map< const unsigned long long hash_code, tList_A> tMap_A;
Attention long long n'est pas standard.
class B{
tMap_A = my_map;
A tab[];
.../...
void add(const unsigned long long hash_code);
void restore(const unsigned long long hash_code);
}
/* sauvegarde d'objets de la table dans une liste
1) existante == rewrite
2) absente == creation
*/
void B::add(const unsigned long long hash_code) {
tList_A my_list;
/*creation d'une liste a partir du hash_code
par copie des objets A contenu dans tab
genre:
for(...)
my_list.push_back(tab[...]); //j'ai une copie
*/
initialise(my_list, hash_code);
my_map.erase(hash_code);
my_map.push_back(my_list); //je supose que j'ai une copie :-(
Une copie ? Ça n'a pas de sens ! où sont le "front" et le "back" d'un arbre,
une std::map<> ?
Ce que tu veux c'est, par exemple :
my_map[has_code]= my_list;
Pour éviter la copie tu écris :
tList_A & my_list(my_map[has_code]);
my_list.clear(); // *Do not* chack my_list.size()
initialise(my_list, hash_code);
avec initialise qui prends une référence sur un(e) tList_A.
Le plus simple :
my_map[has_code]= initialise(hash_code);
avec initialise qui retourne un(e) tList_A.
Y'a-t-il copie ? Ça dépend ! mais qu'importe.
}
/* reecrit les objets dans la table */
void B::restore(const unsigned long long hash_code) {
tMap_A::iterator iter_map = my_map.find(hash_code);
ou tMap_A::iterator const iter_map(my_map.find(hash_code));if(iter_map != my_map.end()) {
tList_A& my_list = iter_map->second; //pas de copie
ou tList_A const & my_list(iter_map->second);
La syntaxe d'initialisation utilisant le symbole = implique une copie.
Attention long long n'est pas standard.
Mais si. Il n'est pas dans ISO 14882:2003,
mais il fait partie de la norme C (ISO 9899:1999), et il a été adopté par le
comité C++ pour la prochaine version de la norme C++.
Et je ne connais pas de compilateur C++ actuel qui ne le supporte pas déjà.
my_map.push_back(my_list); //je supose que j'ai une copie :-(
Une copie ? Ça n'a pas de sens ! où sont le "front" et le "back" d'un arbre,
une std::map<> ?
Je crois qu'il parle d'une copie de la liste.
Personnellement, j'aimerais savoir d'où vient ces list, et
régarder si je ne pourrais pas les construire in situ,
directement dans la map.
(Sauf que j'imagine que my_list, c'est la conventions de nommage pour un
membre, et ici, il ne peut pas être un membre.)
Mais c'est à peu près la limite. J'aurais une tendance à écrire mon code
comme si std::list n'avait pas de constructeur de copie.
(des « building blocks », mais je ne trouve pas d'expression équivalente en
français),
ou tList_A const & my_list(iter_map->second);
La syntaxe d'initialisation utilisant le symbole = implique une copie.
Pas quand on initialise une référence.
(Pas forcément autrement non plus.)
Attention long long n'est pas standard.
Mais si. Il n'est pas dans ISO 14882:2003,
mais il fait partie de la norme C (ISO 9899:1999), et il a été adopté par le
comité C++ pour la prochaine version de la norme C++.
Et je ne connais pas de compilateur C++ actuel qui ne le supporte pas déjà.
my_map.push_back(my_list); //je supose que j'ai une copie :-(
Une copie ? Ça n'a pas de sens ! où sont le "front" et le "back" d'un arbre,
une std::map<> ?
Je crois qu'il parle d'une copie de la liste.
Personnellement, j'aimerais savoir d'où vient ces list, et
régarder si je ne pourrais pas les construire in situ,
directement dans la map.
(Sauf que j'imagine que my_list, c'est la conventions de nommage pour un
membre, et ici, il ne peut pas être un membre.)
Mais c'est à peu près la limite. J'aurais une tendance à écrire mon code
comme si std::list n'avait pas de constructeur de copie.
(des « building blocks », mais je ne trouve pas d'expression équivalente en
français),
ou tList_A const & my_list(iter_map->second);
La syntaxe d'initialisation utilisant le symbole = implique une copie.
Pas quand on initialise une référence.
(Pas forcément autrement non plus.)
Attention long long n'est pas standard.
Mais si. Il n'est pas dans ISO 14882:2003,
mais il fait partie de la norme C (ISO 9899:1999), et il a été adopté par le
comité C++ pour la prochaine version de la norme C++.
Et je ne connais pas de compilateur C++ actuel qui ne le supporte pas déjà.
my_map.push_back(my_list); //je supose que j'ai une copie :-(
Une copie ? Ça n'a pas de sens ! où sont le "front" et le "back" d'un arbre,
une std::map<> ?
Je crois qu'il parle d'une copie de la liste.
Personnellement, j'aimerais savoir d'où vient ces list, et
régarder si je ne pourrais pas les construire in situ,
directement dans la map.
(Sauf que j'imagine que my_list, c'est la conventions de nommage pour un
membre, et ici, il ne peut pas être un membre.)
Mais c'est à peu près la limite. J'aurais une tendance à écrire mon code
comme si std::list n'avait pas de constructeur de copie.
(des « building blocks », mais je ne trouve pas d'expression équivalente en
français),
ou tList_A const & my_list(iter_map->second);
La syntaxe d'initialisation utilisant le symbole = implique une copie.
Pas quand on initialise une référence.
(Pas forcément autrement non plus.)
a partir de cette table je peux rejouer la meilleure variation/refutation
trouvée. Malheuresement cette table n'est pas infinie (2^24) et des
positions importantes peuvent etre reecrite. Je souhaite temporairement
sauvegarder celles ci, pour pouvoir les restaurer.
Et quel est le rôle de la liste, là-dedans ?
a partir de cette table je peux rejouer la meilleure variation/refutation
trouvée. Malheuresement cette table n'est pas infinie (2^24) et des
positions importantes peuvent etre reecrite. Je souhaite temporairement
sauvegarder celles ci, pour pouvoir les restaurer.
Et quel est le rôle de la liste, là-dedans ?
a partir de cette table je peux rejouer la meilleure variation/refutation
trouvée. Malheuresement cette table n'est pas infinie (2^24) et des
positions importantes peuvent etre reecrite. Je souhaite temporairement
sauvegarder celles ci, pour pouvoir les restaurer.
Et quel est le rôle de la liste, là-dedans ?