Menu
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

C++ 教程

C++ 主页 C++ 简介 C++ 入门 C++ 语法 C++ 输出 C++ 注释 C++ 变量 C++ 用户输入 C++ 数据类型 C++ 运算符 C++ 字符串 C++ 数学 C++ 布尔值 C++ if...Else C++ switch C++ while 循环 C++ for 循环 C++ break/continue C++ 数组 C++ 结构体 C++ 枚举 C++ 引用 C++ 指针

C++ 函数

C++ 函数 C++ 函数参数 C++ 函数重载 C++ 作用域 C++ 递归

C++ 类

C++ 面向对象编程 C++ 类/对象 C++ 类方法 C++ 构造函数 C++ 访问修饰符 C++ 封装 C++ 继承 C++ 多态 C++ 文件 C++ 异常 C++ 日期

C++ 数据结构

C++ 数据结构 & STL C++ 向量 C++ 列表 C++ 栈 C++ 队列 C++ 双端队列 C++ 集合 C++ 映射 C++ 迭代器 C++ 算法

C++ 如何操作

C++ 添加两个数字 C++ 随机数

C++ 参考

C++ 参考 C++ 关键字 C++ <iostream> C++ <fstream> C++ <cmath> C++ <string> C++ <cstring> C++ <ctime> C++ <vector> C++ <algorithm>

C++ 示例

C++ 示例 C++ 现实例子 C++ 编译器 C++ 练习 C++ 测验 C++ 证书


C++ 映射


C++ 映射

映射存储元素为“键/值”对。

映射中的元素

  • 可以通过键访问(不是索引),每个键都是唯一的。
  • 自动按键的升序排序。

要使用映射,您必须包含 <map> 头文件

// 包含映射库
#include <map>

创建映射

要创建映射,请使用 map 关键字,并指定它应该存储的键和值的类型,在尖括号 <> 中。最后,指定映射的名称,例如:map<keytype, valuetype> mapName

示例

// 创建一个名为 people 的映射,它将字符串作为键,整数作为值存储
map<string, int> people

如果您想在声明时添加元素,请将它们放在逗号分隔的列表中,放在花括号 {}

示例

// 创建一个映射,用于存储不同人员的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

访问映射

您不能通过引用索引号来访问映射元素,就像您对 数组向量 所做的那样。

相反,您可以通过在方括号 [] 内引用其键来访问映射元素

示例

// 创建一个映射,用于存储不同人员的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 获取与键“John”关联的值
cout << "John is: " << people["John"] << "\n";

// 获取与键“Adele”关联的值
cout << "Adele is: " << people["Adele"] << "\n";
自己尝试 »

您还可以使用 .at() 函数访问元素

示例

// 创建一个映射,用于存储不同人员的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

 // 获取与键“Adele”关联的值
cout << "Adele is: " << people.at("Adele") << "\n";

// 获取与键“Bo”关联的值
cout << "Bo is: " << people.at("Bo") << "\n";
自己尝试 »

注意: .at() 函数通常比方括号 [] 更受欢迎,因为它在元素不存在时会抛出错误消息

示例

// 创建一个映射,用于存储不同人员的姓名和年龄
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 尝试访问一个不存在的元素(将抛出异常)
cout << people.at("Jenny");
自己尝试 »


更改值

您还可以更改与键关联的值

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 将 John 的值更改为 50,而不是 32
people["John"] = 50;

cout << "John is: " << people["John"];  // 现在输出 John is: 50
自己尝试 »

但是,使用 .at() 函数更安全

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 将 John 的值更改为 50,而不是 32
people.at("John") = 50;

cout << "John is: " << people.at("John");  // 现在输出 John is: 50
自己尝试 »

添加元素

要向映射添加元素,可以使用方括号 []

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 添加新元素
people["Jenny"] = 22;
people["Liam"] = 24;
people["Kasper"] = 20;
people["Anja"] = 30;
自己尝试 »

但您也可以使用 .insert() 函数

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 添加新元素
people.insert({"Jenny", 22});
people.insert({"Liam", 24});
people.insert({"Kasper", 20});
people.insert({"Anja", 30});
自己尝试 »

具有相同键的元素

映射不能包含具有相同键的元素。

例如,如果我们尝试将“Jenny”两次添加到映射中,它将只保留第一个

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 尝试添加两个具有相同键的元素
people.insert({"Jenny", 22});
people.insert({"Jenny", 30});
自己尝试 »

总结; 值可以相等,但键必须唯一。


删除元素

要从映射中删除特定元素,可以使用 .erase() 函数

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 通过键删除元素
people.erase("John");
自己尝试 »

要从集合中删除所有元素,可以使用 .clear() 函数

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

// 删除所有元素
people.clear();

查找映射的大小

要查找映射有多少个元素,请使用 .size() 函数

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.size();  // 输出 3
自己尝试 »

检查映射是否为空

使用 .empty() 函数来确定映射是否为空。

如果映射为空,.empty() 函数返回 1 (true),否则返回 0 (false)

示例

map<string, int> people;
cout << people.empty(); // 输出 1 (映射为空)
自己尝试 »

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.empty();  // 输出 0 (不为空)
自己尝试 »

注意: 您也可以使用 .count(key) 函数检查特定元素是否存在。

如果元素存在,它返回 1 (true),否则返回 0 (false)

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.count("John");  // 输出 1 (John 存在)
自己尝试 »

遍历映射

您可以使用 for-each 循环遍历映射。但是,需要注意几件事

  • 您应该在 for 循环中使用 auto 关键字(在 C++ 版本 11 中引入)。这使编译器可以自动确定每个键值对的正确数据类型。
  • 由于映射元素由键和值组成,因此您必须包含 .first 来访问键,并在循环中包含 .second 来访问值。
  • 映射中的元素自动按键的升序排序

示例

map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

for (auto person : people) {
  cout << person.first << " is: " << person.second << "\n";
}

输出结果将是

Adele is: 45
Bo is: 29
John is: 32
自己尝试 »

如果您想颠倒顺序,可以在尖括号中使用 greater<type> 函子,例如

示例

map<string, int, greater<string>> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

for (auto person : people) {
  cout << person.first << " is: " << person.second << "\n";
}

输出结果将是

John is: 32
Bo is: 29
Adele is: 45
自己尝试 »

提示: 也可以使用 迭代器 遍历映射,您将在下一章中详细了解迭代器。



×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.