2010-10-15 9 views
3

J'essaie de faire un arbre de cartes (ou simplement avoir des valeurs d'un point de la carte vers une autre carte), mais je ne sais pas trop comment aborder cela. J'ai trouvé une discussion à ce sujet: http://bytes.com/topic/c/answers/131310-how-build-recursive-map mais je suis un peu confus sur ce qui se passe là-bas. Par exemple, ma clé est un char, et ma valeur est la carte suivante. Voici la déclaration hypothétique:stl carte récursive

map< char, map< char, map< char.......>>>>>>>>>> root_map;

+0

La profondeur de votre arbre est-elle connue et corrigée? – xtofl

+2

Avez-vous une question? – ereOn

+1

fondamentalement vous faites des choses mal. ou peut être une mauvaise approche pour votre problème. Expliquez d'abord quelle est l'affirmation de votre problème avant de résoudre le problème. –

Répondre

2

Peut-être que vous pensez à quelque chose comme:

#include <iostream> 
#include <map> 

template <typename Key, typename Value> 
struct Tree 
{ 
    typedef std::map<Key, Tree> Children; 

    Tree& operator=(const Value& value) { value_ = value; return *this; } 

    Tree& operator[](const Key& key) { return children_[key]; } 

    Children children_; 
    Value value_; 

    friend std::ostream& operator<<(std::ostream& os, const Tree& tree) 
    { 
     os << tree.value_ << " { "; 
     for (typename Children::const_iterator i = tree.children_.begin(); 
       i != tree.children_.end(); ++i) 
      os << i->first << " -> " << i->second << " | "; 
     return os << '}'; 
    } 
}; 

int main() 
{ 
    Tree<int, std::string> t; 
    t[1].children_[1] = "one,one"; 
    t[1].children_[9] = "one,nine"; 
    t[1] = "hmmm"; 
    std::cout << t << '\n'; 
} 

Je ne recommanderais pas vraiment.

1

Je ne suis pas sûr de ce que excatly vous voulez atteindre, mais quand je l'entends « l'arbre de cartes » Je pense que les éléments suivants:

class NodeData 
{ 
    // Some stuff... 
}; 

class TreeNode 
{ 
public: 
    NodeData* data; 
    std::map<char, TreeNode*> children; 
}; 
+0

C'était mon approche originale, et j'ai fini par y revenir. Il se avère que je les reliais juste faux ... merci! –

2

Comme idée, quelque chose comme ceci:

struct CharMap { 
    std::map<char,CharMap> map; 
} root_map; 

et de l'utiliser comme

root_map.map['a'].map['b']; 

Probablement vous pouvez le rendre plus de fantaisie avec des méthodes et des autres opérateurs sur le CharMap que woul d éliminez le besoin du .map lors de l'accès à votre structure.

0

Oui, vous pouvez. Pour que la carte fasse quelque chose d'utile, vous devrez la décorer avec des méthodes (dans ce cas, Set and Get).

#include <map> 
#include <iostream> 

class Clever : public std::map <int, Clever> 
{ 
    public: 
    Clever & Set (int i) { m_i = i; return *this; } 
    int Get (void) { return m_i; } 

    private: 
    int m_i; 
}; 

int main (void) 
{ 
    Clever c; 
    c[0][2][3].Set(5); 

    std::cout << c[0][2][3].Get() << std::endl; 

    return 0; 
}