我有一个std::map和一个std::list.我希望容器中的元素具有相对容器的迭代器的类型.
我该怎么输入它们?
例:
typedef std::map<MyKeyClass, typename MyList::iterator> MyMap;
// ^ MyList not defined.
typedef std::list<typename MyMap::iterator> MyList;
Run Code Online (Sandbox Code Playgroud)
当然,反转两条线是行不通的.
我也试过了
typedef std::map<MyKeyClass,
typename std::list<typename MyMap::iterator>::iterator> MyMap;
typedef std::list<typename MyMap::iterator> MyList;
Run Code Online (Sandbox Code Playgroud)
但那也不起作用.
更新:
我需要这个的原因是通过订单的2个方面跟踪键/值对.让我们说我有一个map<KEY,VALUE>.它按KEY排序,按键查找值很快.但我还希望在添加值时跟踪值.我想知道最近添加的值是哪个.要做到这一点,我使用列表.我需要从地图返回列表的迭代器的原因是擦除容器中的元素.当我用键擦除地图中的元素时,我还需要擦除列表中的元素.我也需要相反(删除最近的值).我发现我的想法是明确地使用指针(如在注释中)不起作用,因为我实际上需要一个迭代器来擦除容器中的元素.
更新2:
我问这个因为我觉得有点奇怪,我不能这样做.我经常使用STL容器作为基本数据结构(就像每个人一样).例如,std::map可以用作具有显式结构和指针的二叉树实现的替代方法.STL容器设计得很好,我没有经历过我不能使用STL容器来表达一些可以通过struct和pointer完成的结构.它们可能无法保证STL容器具有与struct和指针结构相同的属性.但是,由于结构如此简单,我觉得有点奇怪,我无法用STL容器表达它.
您尝试做的事情是不可能的,因为它会创建无休止的递归定义。
考虑一下第二个示例中第一个 typedef 中发生的情况:
typedef std::map<MyKeyClass,
typename std::list<typename MyMap::iterator>::iterator> MyMap;
Run Code Online (Sandbox Code Playgroud)
里面的MyMap会展开,你会得到
typedef std::map<MyKeyClass,
typename std::list<typename std::map<MyKeyClass,
typename std::list<typename MyMap::iterator>::iterator>::iterator>::iterator> MyMap;
Run Code Online (Sandbox Code Playgroud)
然后会有另一个 MyMap 进行扩展。现在您可以看到这是怎么回事了。您应该考虑您想要做什么,看看是否没有更好的方法来对数据结构进行建模。