对于一个已经存在的 map,要想获取其中的某一组值有两种方法,一种是使用 at() 成员函数,另一种则是使用索引 []。接下来将对使用这两种方式时需要注意的事情进行说明。

使用 at() 获取

使用 at() 获取 map 中的成员时,会对其键值做范围检测,如果 map 中不存在相应的键值,at() 会抛出异常。因此在使用 at() 获取 map 中的数据时,通常会将这部分代码放到 try ... catch ... 模块中。

#include <iostream>
#include <string>
#include <map>

int main()
{
std::map<std::string, int> student = { {"Xiao Ming", 10}, {"Xiao Hua", 15}, {"Xiao hong", 13} };
std::string name;
try
{
name = "Xiao Ming";
auto age = student.at(name);
std::cout << name << "'s age is " << age << std::endl;

name = "Xiao Lan";
age = student.at(name);
std::cout << name << "'s age is " << age << std::endl;
}
catch (const std::out_of_range& e)
{
std::cerr << e.what() << '\n' << name << "was not found.\n";
}

return 0;
}

// ----------------------
// output
// Xiao Ming's age is 10
// invalid map<K, T> key
// Xiao Lanwas not found.
// ----------------------

在上面的实例中,当获取 Xiao Lan 的 age 时,由于键值中不存在 Xiao Lan,因此 at() 抛出 invalid map<K, T> key 异常。

使用 [] 获取

使用 [] 获取 map 中的成员时,不会做范围检测,因此当对应的键值不存在时也不会抛出异常。但是值得注意的时,当想要获取的键值不存在时,[] 会调用 map 的构造函数创建一个该键值的成员,并将其值设置为默认值。

#include <iostream>
#include <string>
#include <map>

int main()
{
std::map<std::string, int> students = { {"Xiao Ming", 10}, {"Xiao Hua", 15}, {"Xiao hong", 13} };
std::string name;

for (auto& student : students)
{
std::cout << "name: " << student.first << " age: " << student.second << '\n';
}

std::cout << "size: " << students.size() << std::endl;
auto age = students["Tom"];
std::cout << "size: " << students.size() << std::endl;

for (auto& student : students)
{
std::cout << "name: " << student.first << " age: " << student.second << '\n';
}

return 0;
}
// --------------------
// output
// name: Xiao Hua age: 15
// name: Xiao Ming age: 10
// name: Xiao hong age: 13
// size: 3
// size: 4
// name: Tom age: 0
// name: Xiao Hua age: 15
// name: Xiao Ming age: 10
// name: Xiao hong age: 13
// --------------------

首先初始化一个含有三个对象的 map,然后打印出 map 的相关内容,此时打印 map 的 size 时输出为 3。当使用索引来查找 Tom 键时,由于 map 中不含有 Tom 键值,所以会新创建一个键值为 Tom 的对象。当再次打印 map 时,可以看到已经存在 Tom 键值的对象了。

[] 通常在不存在时插入对象或者修改对象内容时使用