2

我想要两个指向彼此的结构。具体来说,我想要以下内容:

template<typename Key, typename Value> 
class MyStructure {
public:
  typedef map<Key, list<pair<Value, typename ListType::iterator>>> MapType;
  typedef list<typename MapType::element_type::iterator> ListType;
private:
  MapType map_;
  ListType list_;
}

显然这不起作用,因为 ListType 之前没有声明为类型。我怎么能这样做?如您所见,我使用迭代器类型作为指向这两个结构元素的指针。

我正在考虑使用奇怪的重复模板模式,但无法做到这一点。##c++ 上也有人建议使用模板别名,但也失败了(至少,我不知道如何使用这个想法)。

从概念上讲,我做错了吗?或者也许“不符合 C++ 概念”?我当然可以用 void*s 来做到这一点,但我正在尝试以正确的方式做事 :)

谢谢!

4

2 回答 2

3

尽管我怀疑这可能是重复的(并且在很多方面确实如此),但“干杯和 hth。- Alf”正确地指出了潜在的重复问题是专门关于使用typedef这种东西的。

但是,在当前问题中,OP 想知道如何在问题中描述的场景中处理相互包含。

这是一个建议:

#include <list>
#include <map>

template <typename Key, typename Value>
class MyElement;

template <typename Key, typename Value>
class MyStructure
{
public:
  typedef std::map<Key,MyElement<Key,Value> > MapType;
  typedef std::list<MyElement<Key,Value> >    ListType;
};

template <typename Key, typename Value>
class MyElement {
public:
  typename MyStructure<Key,Value>::MapType::iterator  map_iterator;
  typename MyStructure<Key,Value>::ListType::iterator list_iterator;
};

如您所见,我引入了一种新的数据类型MyElement,它包含列表迭代器以及映射迭代器。因为那是一个类而不是 typedef,所以它可以被前向声明。

于 2012-03-08T08:27:28.603 回答
0

不幸的是,以您表达的方式,这是不可能的。

另一方面,在我看来(根据您的要求)您可以反转存储。

如果您使用 a listof the Values,然后让 map 指向这个列表呢?

这将打破循环依赖。

typedef std::list< std::pair<Key, Value> > ListType;
typedef std::multiset<typename ListType::iterator, CmpFirst> MapType;

(不确定我是否真的理解你想要达到的目标......)

您可能应该考虑的另一个解决方案是看看您是否可以用Boost.MultiIndex来表达这一点。当需要多次迭代/查找模式时,Boost.MultiIndex 通常是比手工解决方案更好的选择,因为它在值中交错索引以最小化存储。加上一致性(即,所有索引都引用同一组元素)是给定的。

于 2012-03-08T08:23:32.213 回答