C ++:将hashmap内容复制到指针列表

时间:2010-09-07 05:30:04

标签: c++ list pointers hashmap

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

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

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

我喜欢这个并且不起作用:   对于(...)   {    美孚和放大器; bar = * iter;    list.insert(安培;巴);   }

2 个答案:

答案 0 :(得分:2)

当迭代器变为无效时,指向散列映射中的项的指针将变为无效。

如果你单独留下散列图(即在迭代它并获取其元素的地址后不插入/删除/复制/任何东西),你的指针应保持有效。

答案 1 :(得分:0)

  

我有一个包含项目的hashmap   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...
  

我试图迭代hashmap   并将&amp; * iter's插入列表中   但指针失效为   一旦他们超出范围。

如果您让任何超出范围,则无法使用此列表。如果你需要列表保持超过创建它的函数的返回,请确保在堆上分配列表本身并返回指向它的指针。

  

我应该可以不用这样做   动态分配,不应该吗?

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

  

我喜欢这个并且不起作用:   for(...){Foo&amp; bar = * iter;   list.insert(安培;巴); }

这本身看起来很好,错误在你的代码中的其他地方。这就是为什么你应该遵循詹姆斯的建议并发布足够的代码,我们可以指出你的错误。