【问题标题】:How to store pointer / iterator reference to stl container element in C++?如何在 C++ 中存储对 stl 容器元素的指针/迭代器引用?
【发布时间】:2015-03-14 08:03:50
【问题描述】:

我正在设计一个基于邻接列表的图形类。该类内部有一个 DataStructure :

std::unordered_map<Node,std::list<??>,NodeHash,NodeEqual> map;

我想要的不是??,而是指向存储在列表中的节点元素的指针或指向它的一些迭代器。

我是 C++ 新手。我该怎么办?

【问题讨论】:

  • ??使用Node*
  • 如何从 unordered_map 获取指向现有关键节点的指针?
  • 使用&amp;something 获取SomeClass* 类型指针。
  • 旁白:map 应该是您的Node 对象的所有者,或者应该包含您的Node副本对象?或者是其他地方的所有权,你的 keys 也应该是指针?
  • 我认为 OP 想做一些递归的事情;即序列的类似事物是typedef std::vector&lt;myvec::iterator&gt; myvec;(不起作用)。

标签: c++ pointers c++11 stl


【解决方案1】:

如何从 unordered_map 获取指向现有关键节点的指针?

使用该键查找元素,获取元素的first 成员的地址。

std::unordered_map<Node,std::list<Node*>,NodeHash,NodeEqual> map;
Node node1;
(void) map[node1];  // add { node1, {} }  to the map
...
auto iter = map.find(node1);
if (iter != map.end())
{
  Node* n = &iter->first;
  Node node2;
  map[node2].push_back(n);
}

这里的n 是一个指向现有密钥的指针,它等于node1

【讨论】:

  • 我需要 const GNode *n = &iter->first;使指针工作,然后 map[somenode].push_front(n);不工作:(
  • 啊,很好,地图键是const,以防止您更改它们并使它们在地图中的位置无效。你可以改用std::list&lt;const Node*&gt; 吗?如果没有,您可以使用 const_cast&lt;Node*&gt;(&amp;iter-&gt;first) 获取非常量指针,但您必须确保您不会通过该指针更改节点的哈希码。
【解决方案2】:

这适用于ideone;我不知道它是否便携。

struct M;
typedef std::unordered_map<Node, std::list<M>, NodeHash, NodeEqual> mymap;
struct M { mymap::iterator x; };

不幸的是,M 不是 相当 mymap 的迭代器,但它非常接近。

ideone 抱怨如果我尝试使用相同的技巧使 M 成为 std::list&lt;mymap::iterator&gt; 的包装器)

【讨论】:

  • 这在技术上是未定义的行为,因为mymap::iterator 实例化了std::list&lt;M&gt;,它在该点是不完整的类型,[res.on.functions] 禁止这样做。不过它应该适用于所有实现,因为在实践中 std::list&lt;M&gt; 实际上并不需要完整的类型,直到您尝试使用它。
猜你喜欢
  • 2012-07-11
  • 2014-12-05
  • 2011-07-08
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2010-12-21
相关资源
最近更新 更多