我正在使用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;
我可以理解这与一些指针问题有关。可能是什么原因?我还有什么其他选择?我想传递地图而不涉及副本,因为地图将包含大量信息。
答案 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;
}