5 votes

carte stl récursive

J'essaie de créer un arbre de cartes (ou simplement de faire pointer les valeurs d'une carte vers une autre carte), mais je ne sais pas trop comment m'y prendre. 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 ici.

Par exemple, ma clé est un caractère, et ma valeur est la carte suivante. Voici la déclaration hypothétique :

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

2voto

Tony D Points 43962

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 le recommanderais pas vraiment.

2voto

Je ne sais pas exactement ce que vous voulez obtenir, mais quand j'entends "arbre de cartes", je pense à ce qui suit :

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

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

2voto

user1182474 Points 414

Comme idée, quelque chose comme ça :

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

et l'utiliser comme

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

Vous pourriez probablement le rendre plus sophistiqué avec des méthodes et des opérateurs supplémentaires sur le CharMap qui élimineraient le besoin de la fonction .carte lors de l'accès à votre structure.

2voto

QuestionC Points 1490

Oui, vous pouvez. Cependant, pour que la carte ait une utilité quelconque, vous devez l'agrémenter de méthodes (dans ce cas, Set et 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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X