与unordered_map相关的类型

时间:2019-06-20 17:49:37

标签: c++ stl circular-dependency libstdc++

假设我要在条目之间保持一定顺序 unordered_map 的值。一种高效的内存存储方式似乎是在映射条目之间保留一个链表。即,我将使用unordered_map ,而不是将unordered_map 定义为

startAfter()

这是有效的C ++吗? Clang和gcc不允许这样说Node是不完整的类型。有关完整的错误消息,请参见下文。双方都接受以下内容:

struct Node {
  int val;
  typename std::unordered_map<int, Node>::iterator up;
};

这里的规则到底是什么?为什么第一个不被接受但是第二个很好呢?在相关的question中,出现了类似的问题,但是,要在此处应用相同的解释,必须是unordered_map包含一个Value对象而没有任何间接引用。即unordered_map的定义应如下所示:

template<typename Key, typename Value>
struct Map {
  struct MapEntry {
    Key key;
    Value val;
    MapEntry *prev, *next;
  };

  using Iterator = MapEntry*;
};

struct Node {
  int val;
  Map<int, Node>::Iterator up;
};

我不明白为什么unordered_map应该直接存储值。除此以外, 就像我在上面给出的玩具示例struct Map中一样,没有依赖周期。

template<typename Key, typename Value>
class unordered_map {
  Value val;
  using value_type = std::pair<const Key, Value>;
  using entry = std::tuple<value_type, entry*, entry*>;
  using iterator = entry*;
};

1 个答案:

答案 0 :(得分:1)

A,

struct Node {
  int val;
  typename std::unordered_map<int, Node>::iterator up;
};
从C ++ 17标准开始,

不是有效的C ++。根据{{​​3}}最近被C ++ 17接受,向Nodestd::vectorstd::list提供不完整的类型std::forward_list是有效的,但是unordered_map仍需提供完整的类型。

MSVC和libc ++可以很好地使用不完整的值,但这是由于它们超出了标准的要求。