为什么我在std :: map上使用Operator []无效?

时间:2016-10-12 19:49:29

标签: c++

假设我有一个类型为

的地图
std::map<int, Node> G;

节点如下

struct Node{
  Node(){};
  int data;
};

我想使用operator []返回对节点的引用(如果它在地图中),或者创建一个新节点并返回引用(如果不是)。这是我对文档所说内容的理解:

  

如果k匹配容器中元素的键,则该函数返回对其映射值的引用。

     

如果k与容器中任何元素的键不匹配,则该函数会使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也总是会将容器大小增加1。

但是,以下代码会引发错误(g ++ 5,std = gnu ++ 11):

  

错误:无法在赋值时将'std :: map :: mapped_type {aka Node}'转换为'Node *'u_ptr = G [3];

Node* u_ptr;
u_ptr = G[3];

在我见过的所有例子中,G[k]出现在lhs上。 rhs上不允许G[k]吗?如果没有,为什么?

1 个答案:

答案 0 :(得分:5)

d3.stack()会返回std::map<Key, T>::operator[]引用。

在这种情况下,T&T,因此Node会返回G[3]引用,然后您尝试将其分配给Node&指针。这就是您收到编译器错误的原因。

所以,你可以:

  1. Node*更改为参考:

    u_ptr
  2. 使用Node& u_ptr = G[3]; 地址运算符将引用转换为指针:

    &