8

据我了解, std::map 中的值对中的键一旦插入就无法更改。这是否意味着使用 const 键模板参数创建映射无效?

std::map<int, int> map1;
std::map<const int, int> map2;
4

4 回答 4

13

您的标题问题的答案是肯定的。它们是有区别的。您不能将 a 传递给std::map<int, int>需要 a 的函数std::map<const int, int>

然而,地图的功能行为是相同的,即使它们是不同的类型。这并不罕见。在许多情况下,int 和 long 的行为相同,即使它们在形式上是不同的类型。

于 2009-08-11T14:39:49.083 回答
1

因为 int 是按值复制的,所以这个 const 声明没有意义。在另一方面

std::map<const char*, int> map2; 

戏剧性地改变了画面

于 2009-08-11T11:44:47.713 回答
1

std::map无论如何都要构造它的键类型:std::map<int, int>::value_typeis std::pair<const int, int>. 如果您将 a 添加const到键类型,const const int将简单地折叠为const int

于 2009-08-11T14:15:55.270 回答
0

正如 Dewfy 所说,在您给出的示例中,这无关紧要,因为 int 是内置类型,它将按值复制,但使用 char* 有点不同......

如果你有

std::map<char *, int> map;

然后你不能插入一个声明为 const char* 的变量会失败

char * y = new char[4];
const char * x = "asdf";
std::map<char *, int> map;
map.insert(make_pair(y, 4)); //ok
map.insert(make_pair(x, 4)); //fail

std::map<char*, int> map;

你实际上可以说

char * x = new char[1];
(*x) = 'a';
map<char*,int>::iterator it = map.begin();
cout<<it->first; //prints 'a'
(it->first)[0] = 'x'
cout<<it->first; //prints 'x'

 std::map<const char *, int>

你将被限制使用

 map<const char*, int>::iterator 
于 2009-08-11T12:13:18.017 回答