我希望能够有一个地图,其中值是指向地图的指针。像
这样的东西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/1208331或http://qscribble.blogspot.fr/2008/06/circular-template-references-in-c.html,但我不确定它们是否以及如何应用于我的案例。
他们使用自己的类(Vertex和Edge; A和B),但是这里std :: map和std :: map :: value_type已经在STL头文件中定义了,我不能只用它来实例化它们组合课。
有没有办法定义上面的地图?
答案 0 :(得分: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所说的那样,你似乎在建模一个有向图,每个节点最多有一个出边。如果你想用图表做一些事情,那里有图表库 - 如果你正在做其他事情,或者如果你只是想学习,那那就是另一个故事。
答案 1 :(得分:0)
来自http://www.sgi.com/tech/stl/Map.html
Map是一个Pair关联容器,意味着它的值类型为
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));
}