【问题标题】:C++: Copying hashmap contents to pointer listC ++:将哈希图内容复制到指针列表
【发布时间】:2011-04-09 00:46:58
【问题描述】:

我有一个包含 struct Foo 项(不是指针)的哈希图。现在,我想在列表中有这些项目的指针。我怎样才能做到这一点?

我尝试迭代哈希图并将 &*iter 插入列表,但指针一旦超出范围就会失效。

我应该能够在没有动态分配的情况下做到这一点,不是吗?

我喜欢这样,但它不起作用: 为了(...) { Foo& bar = *iter; list.insert(&bar); }

【问题讨论】:

  • 如果您发布一些演示问题的代码会有所帮助。 “指针一旦超出范围就会失效”是什么意思?你的意思是“一旦哈希图超出范围?”
  • 没有。 Hashmap 是在整个程序运行期间有效的类的成员。

标签: c++ list pointers hashmap


【解决方案1】:

我有一个包含项目的哈希图 struct Foo (不是指针)。现在我 想要这些项目的指针 在一个列表中。我该怎么做?

像这样:

typedef Whatever_Hash_Map<Foo> Container;
Container container;
...populate container...
std::list<Foo*> l;
for (Container::const_iterator i = container.begin(); i != container.end(); ++i)
    l.insert(&*i);
...use list...

我尝试迭代哈希图 并将 &*iter 插入到列表中 但指针无效为 一旦超出范围。

如果您让 anything 超出范围,您将无法使用此列表。如果您需要列表在创建它的函数返回后仍然存在,请确保在堆上分配列表本身并返回指向它的指针。

我应该能够做到这一点 动态分配,不是吗?

列表动态分配节点。 Hash Map 可能在内部动态分配桶。但是,您不必动态显式分配指向 Foo 的指针 - 所有标准容器和类似容器都会使用值语义(即 Foo 的复制构造函数或赋值运算符)将 Foo 复制到堆上。

我喜欢这样,但它不起作用: for(...) { Foo& bar = *iter; list.insert(&bar); }

这本身看起来不错,错误在代码的其他地方。这就是为什么您应该遵循 James 的建议并发布足够的代码以便我们指出您的错误。

【讨论】:

    【解决方案2】:

    在迭代器失效的同时,指向 hashmap 中项目的指针也会失效。

    如果您不理会哈希图(即在迭代并获取其元素的地址后不插入/删除/复制/任何内容),您的指针应该保持有效。

    【讨论】:

    • 我不管它,但它没有帮助
    • 假设使用hash_map(来自STL)或unordered_map(来自C++0x),那么当元素被添加到容器或从容器中移除时迭代器不会失效(除了删除元素时,该元素的任何迭代器都会失效,显然)。
    • @James 同意,但 Kitty 没有说明实现是什么(尽管可以合理地预期任何实现都具有相同的属性)。
    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 2013-01-10
    • 2013-06-24
    • 1970-01-01
    • 2011-02-01
    • 2017-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多