【问题标题】:How to have: map<T, vector<iterator to map itself> >?如何拥有:map<T, vector<iterator to map self>>?
【发布时间】:2013-09-04 09:21:44
【问题描述】:

我需要一个 map,它的键是某种复合类型 T地图本身的迭代器的向量。
(例如,想象一个图,其中每个节点都包含指向其父节点的迭代器。)

我避免将父母的 存储为值的原因是键是昂贵的对象,所以我想改为存储迭代器。

这样的事情可能吗?
如果没有,最好的选择是什么?

(我知道我可以使用多态性和类型擦除作为暴力破解方法来解决这个问题,但我想知道是否有更好的方法。)

【问题讨论】:

  • 是否有特定原因导致父级的链接采用迭代器的形式?
  • @Jon:我将它们保留为迭代器,因为稍后我可能需要使用它们遍历地图。我还能用什么?我认为指针不会改变任何东西吗?
  • 问题是,如何遍历地图 - 即地图排序是否以某种方式对应于图形的结构?如果不是,那么遍历地图有多重要(与遍历显然很重要的图表相比)?
  • @Jon:例如,只是将所有内容复制到该节点。这不是很重要——如果您有其他想法,请务必提及。

标签: c++ map stl iterator


【解决方案1】:

由于 23.2.1 通用容器要求:

Containers are objects that store other objects. They control allocation
and deallocation of these objects through constructors, destructors, 
insert and erase operations.

因此有可能:

struct Key;
struct Value;
typedef std::map<Key, Value> Map;

struct Key {};
struct Value {
    std::vector<Map::iterator> parents;
};

(所有类型和大小都是已知的)

【讨论】:

  • +1 哇,这太棒了!我想它不能保证有效,但对我来说已经足够了,谢谢!
  • 嗯,问题是std::map 不一定允许不完整的类型作为参数,所以map&lt;Key, Value&gt; 不一定有效,因为此时没有定义Value。但这对我来说不是问题,因为如果它在某些编译器上不起作用,我可以切换到 boost::container::map 就可以了。不过谢谢! :)
  • @Mehrdad Ouote 来自 4.3.1 模板类型参数:“[注意:模板类型参数可能是不完整的类型 (3.9)。-结束注释]”
  • @Mehrdad 如果您在“实例化模板时”仔细阅读接受的答案。上面的声明没有实例化。
  • @Mehrdad 其实你是对的,有 map::iterator 的实例化。
【解决方案2】:

您很可能希望存储指向父级的智能指针而不是迭代器。

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多