рекурсивная карта STL - PullRequest
       19

рекурсивная карта STL

3 голосов
/ 15 октября 2010

Я пытаюсь создать дерево карт (или просто указать значения карты, указывающей на другую карту), но я не слишком уверен, как к этому приблизиться.Я нашел обсуждение по этому поводу: http://bytes.com/topic/c/answers/131310-how-build-recursive-map, но я немного запутался в том, что там происходит.

Например, мой ключ - это символ, а мое значение - следующая карта.Вот гипотетическая декларация:

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

Ответы [ 4 ]

2 голосов
/ 18 января 2014

Как идея, что-то вроде этого:

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

и используйте его как

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

Возможно, вы могли бы сделать его более привлекательным с помощью дополнительных методов и операторов в CharMap, которые могли бы уничтожитьнеобходимость .map при доступе к вашей структуре.

2 голосов
/ 15 октября 2010

Может быть, вы думаете о чем-то вроде:

#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';
}

Я бы не советовал.

1 голос
/ 26 ноября 2014

Да, вы можете.Чтобы карта могла сделать что-нибудь полезное, вам нужно будет украсить ее методами (в данном случае Set и 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;
}
1 голос
/ 15 октября 2010

Я не совсем уверен, чего вы хотите достичь, но когда я слышу «дерево карт», я думаю о следующем:

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

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