在映射中插入对指针的引用

Insert reference to pointer into an map

本文关键字:指针 引用 插入 映射      更新时间:2023-10-16
struct A
{
};
int main()
{
  A *a = new A;
  std::unordered_map<int, A*&> hash;
  hash.insert(make_pair(1, a)); //error
}

使这项工作的语法是什么?

如果我这样做:

a = new A;

我希望hashmap指向新对象。

hash.insert(std::p air(1, a((;

在您的

示例中,std::make_pair的返回类型是std::pair<int, A*>而不是std::pair<int, A*&>(由于模板参数推导(。

这确实可以解决问题:

hash.insert(std::make_pair<int, A*&>(1, a)); //no error

请注意,存储对地图和其他数据结构的引用并不常见。想想你是否真的需要它。

这个问题忽略了STL设计中固有的价值语义。

价值语义意味着

值被存储并复制到容器(包括指针(中,而不是引用中。

当您将某些内容插入容器时,即使您传入的是引用变量,也会创建并存储副本。

这意味着你不能有像 std::vector<> 这样的引用结构。

在您的特定示例中,省略引用符号 (&(,您没问题(除了内存泄漏(。在 stl 中存储指针很便宜,因此您不必担心复制指针的成本。

但是,与C++一样,您必须关注清理(如果您不使用智能指针(和对象生存期。