如果在STL map中,键值(key)未被初始化,那么map[key]会返回什么?

35

这里是一些示例代码:

 #include<iostream>
 #include<map>
 #include<string>
 using namespace std;

 int main()
 {
   map<char, string> myMap;
   myMap['a'] = "ahh!!";
   cout << myMap['a'] << endl << myMap['b'] << endl;
   return 0;
 }

在这种情况下,我想知道 myMap['b'] 返回什么?


2
你的代码甚至无法编译。你没有定义 ab - Prasoon Saurav
4
"a" 和 "b" 是字符而不是变量。这段代码可以编译运行,且变量已定义。 - jainsha
4个回答

41

使用默认构造的std::string插入到键为'b'std::map中,并返回对其的引用。

通常有必要查看文档, 它定义了operator[]的行为:

返回与特定键相关联的对象的引用。 如果映射尚未包含这样的对象,则operator[]会将默认对象data_type()插入其中。

(SGI STL文档不是C++标准库的文档,但它仍然是一个宝贵的资源,因为大多数标准库容器的行为与SGI STL容器的行为相同或非常接近。)


1
而 STL 的 (其中一位) 原始作者据我所知确实写了 SGI 的文档。尽管我没有证据,这可能只是一个互联网传说。 - Martin York
1
那将是Matt Austern。他已经成为一个重要的贡献者,比Stepanov和Lee更长时间(他们通常被认为是原始作者)。他还写了《泛型编程和STL》。 - MSalters
默认对象是什么?在哪里可以找到这些对象的列表?例如,整数的默认值是0吗? - trusktr

5

返回一个默认构造的对象(例如,在这种情况下是一个空字符串)。

即使你说map['a'] = "ahh!!";,实际上也会返回默认构造的字符串。 [] 运算符将一个默认构造的字符串插入到位置 'a',并返回对它的引用,然后在其上调用=运算符。


4
如果您尝试使用索引运算符[]访问键值,则可能发生两件事情:
  1. 映射包含此键。因此,它将返回相应的键值。
  2. 映射不包含该键。在这种情况下,它将自动向映射中添加一个键,并将其键值设置为null。
由于您的映射中不存在'b'键,因此它会自动将此键添加到映射中,并将其值设置为空字符串"",然后打印出这个空字符串。
此时,映射大小将增加1
因此,要查找键,可以使用.find()方法,如果未找到键,则返回map.end()。并且不会自动添加额外的键。
当您为键设置值时,您可以使用[]运算符。

2

std::mapoperator[]会在查找的键不存在时向地图中插入默认构造的值类型。因此,您将得到一个空字符串作为查找结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接