OVH Cloud OVH Cloud

Tableau associatif à plusieurs dimensions

12 réponses
Avatar
Adrien Constant
Bonjour,

De la FAQ C++ lite:

[34.2] How can I make a perl-like associative array in C++?
Use the standard class template std::map<Key,Val>:

#include <string>
#include <map>
#include <iostream>

int main()
{
std::map<std::string, int, std::less<std::string> > age;
age["Fred"] = 42; // Fred is 42 years old
std::cout << "Fred is " << age["Fred"] << " years old\n";
}

Seulement,map n'associe que key à val et ne permet pas d'utiliser
plusieurs dimensions.

Y a t-il une fonction de librarie standard qui permette de faire du genre
age["Europe"]["France"]["Fred"] = 42;
par exemple ?

Sachant que le nombre de niveaux maximum n'est connu qu'à l'exécution.

Merci.

2 réponses

1 2
Avatar
Adrien Constant
Après avoir un peu cherché, il y a apparemment boost::multi_array qui a
une méthode similaire.

Fabien LE LEZ wrote:
On Fri, 17 Oct 2003 14:56:13 +0200, Adrien Constant
wrote:


Sachant que le nombre de niveaux maximum n'est connu qu'à l'exécution.



J'avais pas lu ça...
Bon, ben dans ce cas, la syntaxe que tu demandes me paraît difficile à
obtenir.

La solution qui me paraît la plus simple : un map<> avec comme clef
soit un vector<string>, soit une classe plus ou moins basée sur
vector<string>.

Autre solution : une structure d'arbre.

template <class Feuille> class Noeud
{
public:
typedef std::map <std::string, Noeud> Data;
bool EstFeuille() const;
class MauvaisType;
operator Feuille&() throw (MauvaisType);
Noeud& operator[] (std::string const&) throw (MauvaisType);

private:
Feuille valeur;
Data noeuds_enfants;
};

En gros, ma_map["Fred"] est soit un nombre, soit un conteneur ; si
c'est un conteneur, tu peux écrire ma_map["Fred"]["truc"] ; sinon, tu
peux le convertir en un "Feuille&" (int dans ton cas).

NB : j'ai peu d'expérience dans ce type de structure, il doit être
possible de faire plus élégant.






Avatar
Fabien LE LEZ
http://www.giromini.org/usenet-fr/repondre.html
--
http://www.giromini.org/usenet-fr/repondre.html
1 2