4

我希望能够有一个地图,其中值是指向地图的指针。就像是

std::map<KeyType, const_pointer_to_this_map's_value_type>

我知道我可以使用 const void * 而不是 const_pointer_to_this_map's_value_type。

我已经看到了循环数据类型定义的技巧,例如https://gist.github.com/tivtag/1208331http://qscribble.blogspot.fr/2008/06/circular-template-references-in-c .html但我不确定它们是否以及如何应用于我的案例。

他们在那里使用自己的类(Vertex 和 Edge;A 和 B),但这里的 std::map 和 std::map::value_type 已经在 STL 标头中定义,我不能只用 Combo 类来实例化它们。

有没有办法定义上面的地图?

4

2 回答 2

1

只需将其包装在一个结构中即可。您需要为类型命名以便能够引用它。

template<class T>
class Graph {
    std::map<T, const Graph<T>*> data;
public:
    // ...
};

在 C++11 中,您还可以使用带有前向声明的 typedef 的模板别名来执行此操作:

namespace {

template<class T>
struct GraphWrap {
    class type;
    typedef std::map<T, const typename GraphWrap<T>::type*> type;
};

}

template<class T>
using Graph = typename GraphWrap<T>::type;

当然,std::map在这里使用可能会有点误导,因为您使用的是键类型参数作为容器的值类型。就像 Mooing Duck 说的那样,您似乎正在建模一个有向图,其中每个节点最多有一个出边。如果你想用图表做点什么,那里有图表库——如果你正在做其他事情,或者如果你只是想学习,那就另当别论了。

于 2013-06-25T19:19:12.997 回答
0

来自http://www.sgi.com/tech/stl/Map.html

Map是一个Pair Associative Container,意味着它的值类型是pair<const Key, Data>

std::map<K, M>::value_type总是std::pair<K, M>,所以:

#include <map>

typedef int KeyType;

struct MappedType
{
    const std::pair<const KeyType, MappedType>* p;
};

void g()
{
    std::map<KeyType, MappedType> m;

    m[0].p = 0;
    m[1].p = &(*m.find(0));
}
于 2013-06-26T10:12:24.737 回答