C ++ Maps,这两个声明如何不正确?

时间:2017-11-09 12:48:16

标签: c++ pointers maps

我正在使用map存储元素,我需要分配一个动态映射内存,这样我就可以将这个内存传递给调用函数,而不会有任何麻烦但是下面的代码片段让我感到困惑。看看这里。

std :: map <int, int> map1;
map1[some_integer_x] = some_integer_y; // OK at compilation.

但是以下代码段不正常并且出错。

std :: map <int, int> * map2 = new std :: map <int, int>
map2[some_integer_x] = some_integer_y; // Not OK at compilation.

以下是GCC 5给出的错误。

error: no match for ‘operator=’ (operand types are ‘std::map<int, int>’ and ‘int’)
map2[some_integer_x] = some_integer_y;

我可以理解这与一些指针问题有关。可能是什么原因?我还有什么其他选择?我想传递地图而不涉及副本,因为地图将包含大量信息。

3 个答案:

答案 0 :(得分:3)

map2是指向map的指针。

要访问std::map::operator[],您需要先使用运算符*取消引用指针。

由于[]的运算符优先级高于*,因此需要编写

(*map2)[some_integer_x] = some_integer_y; 

答案 1 :(得分:3)

由于map2是指针,因此operator[]的工作方式与std::map<int, int>数组的工作方式相同。

该行:

map2[some_integer_x] = some_integer_y;

表示“转到元素some_integer_x并为其指定值some_integer_y”。

导致不匹配类型的编译错误,因为 您尝试为其分配整数值的map2[some_integer_x]类型为std::map<int, int>

所以,首先你需要尊重指针:

(*map2)[some_integer_x] = some_integer_y; 

答案 2 :(得分:1)

您正在操作指向地图的指针,就好像它是地图的实例一样。您需要在使用前取消引用指针,如下例所示:

#include <map>
#include <iostream>

int main() {

  std :: map <int, int> map1;
  map1[1] = 2;   
  std::map<int, int> *map2 = new std::map<int, int>();
  (*map2)[1] = 3;   
  std::cout << "Map1 at location 1 is: " << map1[1] << std::endl; //Prints 2
  std::cout << "Map2 at location 1 is: " << (*map2)[1] << std::endl; // Prints 3
  delete map2;
}