我有std::map
和std::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容器表达它。
答案 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;