Typedef相互引用的stl容器

时间:2014-07-19 15:43:41

标签: c++ list map stl

我有std::mapstd::list。我希望容器中的元素具有相反容器的迭代器类型。

我如何输入它们?

示例:

 typedef std::map<MyKeyClass, typename MyList::iterator> MyMap;
 //                                    ^ MyList not defined.
 typedef std::list<typename MyMap::iterator> MyList;

当然,反转两条线并不起作用。

我也试过

 typedef std::map<MyKeyClass,
                  typename std::list<typename MyMap::iterator>::iterator> MyMap;
 typedef std::list<typename MyMap::iterator> MyList;

但这也不起作用。

更新 我需要这个的原因是通过订单的2个方面来跟踪键/值对。我们说我有map<KEY,VALUE>。它按KEY排序,按键查找值很快。但我还希望在添加值时跟踪值。我想知道最近添加的值是哪个。要做到这一点,我使用列表。我需要从地图返回列表的迭代器的原因是擦除容器中的元素。当我用键擦除地图中的元素时,我还需要擦除列表中的元素。我也需要相反(删除最近的值)。 我发现我的想法是明确地使用指针(如在注释中)不起作用,因为我实际上需要一个迭代器来擦除容器中的元素。

UPDATE2: 我问这个是因为我觉得有点奇怪,我不能这样做。我经常使用STL容器作为基本数据结构(就像每个人一样)。例如,std::map可以用作具有显式结构和指针的二叉树实现的替代方法。 STL容器设计得很好,我没有经历过我不能使用STL容器来表达一些可以通过struct和pointer完成的结构。它们可能无法保证STL容器具有与struct和指针结构相同的属性。但是,由于结构如此简单,我觉得有点奇怪,我无法用STL容器表达它。

4 个答案:

答案 0 :(得分:1)

你可能正在寻找一个多索引容器,就像在boost中找到的容器一样。它允许您按多种键类型对地图/集进行排序和访问。

Boost bimap是一个类似的工具,只有两个键/索引,基本上允许您通过键和值访问地图。

答案 1 :(得分:0)

您尝试做的事情是不可能的,因为它创造了无限的递归定义。

考虑第一个typedef中发生的事情,在第二个例子中:

typedef std::map<MyKeyClass,
    typename std::list<typename MyMap::iterator>::iterator> MyMap;

MyMap里面会被扩展,你会得到

typedef std::map<MyKeyClass,
    typename std::list<typename std::map<MyKeyClass,
        typename std::list<typename MyMap::iterator>::iterator>::iterator>::iterator> MyMap;

然后会有另一个MyMap扩展。 现在你可以看到它的发展方向。您应该考虑自己要做的事情,看看是否有更好的数据结构建模方法。

答案 2 :(得分:0)

我想知道你为什么需要ciclic类型的唯一原因是因为map存储了对列表的引用,而列表存储了对map的引用。换句话说,您希望在地图和列表之间共享数据。使用std::shared_ptr的地图和std::shared_ptr的列表,这样您就可以轻松地在地图和列表之间共享元素(哪些是真实数据)。

答案 3 :(得分:0)

毕竟我写了下面的代码。它由g ++编译。

struct ListEntry;
typedef std::unordered_map<MyKeyClass, typename std::list<ListEntry>::iterator> KeyMap;
struct ListEntry{
   typename KeyMap::iterator it;                                                       
};
typedef std::list<ListEntry> MyList;