Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Typedef相互引用的stl容器_C++_List_Map_Stl - Fatal编程技术网

C++ Typedef相互引用的stl容器

C++ Typedef相互引用的stl容器,c++,list,map,stl,C++,List,Map,Stl,我有一个std::map和一个std::list。我希望容器中的元素具有相反容器的迭代器类型 我怎样才能打字 示例: typedef std::map<MyKeyClass, typename MyList::iterator> MyMap; // ^ MyList not defined. typedef std::list<typename MyMap::iterator> MyList;

我有一个
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 MyMap;
//^MyList未定义。
typedef std::list MyList;
当然,颠倒这两条线是行不通的

我也试过了

 typedef std::map<MyKeyClass,
                  typename std::list<typename MyMap::iterator>::iterator> MyMap;
 typedef std::list<typename MyMap::iterator> MyList;
typedef std::map MyMap;
typedef std::list MyList;
但这也不起作用

更新: 我需要它的原因是通过订单的两个方面来跟踪键/值对。假设我有一张
地图
。它是按键排序的,按键查找值很快。但我也希望在添加值时跟踪这些值。我想知道最近增加的值最少。要做到这一点,我使用列表。我需要从映射返回列表的迭代器的原因是删除容器中的元素。当我用键擦除地图中的一个元素时,我还需要擦除列表中的一个元素。我还需要相反的值(删除最近最短的值)。 我发现我的想法是显式使用指针(如在注释中)不起作用,因为我实际上需要一个迭代器来删除容器中的元素

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

您试图做的是不可能的,因为它创建了一个无休止的递归定义

考虑在第二个示例中,第一个typedef中发生了什么:

typedef std::map<MyKeyClass,
    typename std::list<typename MyMap::iterator>::iterator> MyMap;
typedef std::map MyMap;
里面的MyMap会被扩展,你会得到

typedef std::map<MyKeyClass,
    typename std::list<typename std::map<MyKeyClass,
        typename std::list<typename MyMap::iterator>::iterator>::iterator>::iterator> MyMap;
typedef std::map MyMap;
然后会有另一个MyMap在那里扩展。
现在你可以看到这是怎么回事了。你应该考虑你想做的事情,看看是否有更好的方法来建模你的数据结构。

< P>我唯一想知道你为什么需要CICRIC类型的原因是因为地图存储了对列表的引用,并且列表存储了对地图的引用。换句话说,您希望在地图和列表之间共享数据。使用
std::shared_ptr
s的映射和
std::shared_ptr
s的列表,可以轻松地在映射和列表之间共享元素(真正的数据)。

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


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

毕竟我写了下面的代码。它是由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;
struct-ListEntry;
typedef std::无序_映射键映射;
结构列表输入{
typename键映射::迭代器;
};
typedef std::list MyList;

这就像
struct X{Y;};结构Y{X;},不是吗?是的,但在这种情况下,我们可以使用前向声明。我如何用我的例子做到这一点?更新:很抱歉,它不能通过转发声明完成,因为它不是指针。这里我使用迭代器作为指针。所以我想做的是类似于迭代器的前向声明。。。您无法控制标准库容器的内部,因此无法断言“它就像指针”。标准规定类型必须是完整的,句号。@shuszuki——在
X{Y;}的情况下;结构Y{X;}不能向前声明X或Y,因为要求它们也是完整类型。正向声明提供了不完整的类型,只能用于指针声明。@Kerrek Yea我知道。我想知道是否有解决这个问题的办法。明确使用容器中变量的指针可能是一种可能的解决方案。但我仍然不能确信这是我们唯一能做的事情。我更新了问题。是的,我想在地图和列表之间共享数据。(在我更新的问题中,案例值是共享的。)。但我仍然想知道如何根据需要删除容器中的元素。+1:Boost Multi-index和bimap还支持将“时间顺序”作为索引(,检查示例)