C++ Map

2025年8月29日 | 阅读 12 分钟

在 C++ 中,map 是 STL (Standard Template Library) 的一部分。Map 是关联容器,用于存储排序的键值对,其中每个键都是唯一的,可以插入或删除,但不能修改。与键关联的值可以被更改。

C++ Map

语法

它具有以下语法:

参数

它有以下参数

  • Key_type: Map 中要存储的键数据类型。
  • Value_type: Map 中要存储的值的数据类型。
  • compare: 一个比较类,接受两个相同类型的参数,返回 bool 值。此参数是可选的,默认为 less<"key">。
  • t: 表示分配给 map 的名称。

C++ 算法示例

让我们通过一个例子来演示 C++ 中的算法 STL。

示例

编译并运行

输出

Employees[104]=Deep

Map size: 5

Natural Order:
101: Alice
102: Bob
103: Dolly
104: Deep
105: John

Reverse Order:
105: John
104: Deep
103: Dolly
102: Bob
101: Nikita

Map 函数操作

Map 函数可以执行多种操作。这些操作如下

  • 访问 Map 中的元素
  • 更改 Map 中的值
  • 向 Map 添加元素
  • 具有相同键的元素
  • 从 Map 中移除元素
  • 查找 Map 的大小
  • 检查 Map 是否为空
  • 遍历 Map

现在,我们将逐一讨论所有这些操作。

访问 Map 中的元素

与数组或向量不同,Map 不能使用索引号访问,因为数据是以键值对的形式存储而不是顺序存储的。相反,我们必须使用键来访问条目。方括号 [] 与键一起用于从 Map 中获取值。

C++ 访问元素示例

让我们看一个 C++ 访问 Map 中元素的例子。

示例

编译并运行

输出

Alice has 5 years of experience.
Bob has 3 years of experience.
Charlie has 8 years of experience.
ERROR!
David has Error: 'David' is not found in the employee list.

说明

在此示例中,我们使用 Map 函数将员工姓名作为键,将工作年限作为值。它使用 [] 和 .at() 方法检索并显示特定员工的经验。

更改 Map 中的值

在 C++ 中,我们可以通过为特定键赋新值来更改 Map 中该特定键的值。当我们想编辑现有记录时,例如更改薪水、年龄或分数,这非常有用。

C++ 更改 Map 中值示例

让我们通过一个例子来演示 C++ 中更改 Map 中值的方法。

示例

输出

Updated Employee Ages:
Adarsh is 32 years old.
Dia is 26 years old.
Jacob is 36 years old.
James is 27 years old.
John is 28 years old.
Joseph is 29 years old.
Wesly is 31 years old.

说明

在此示例中,我们使用 Map 来存储和管理员工姓名和年龄。它展示了如何使用 [] 和 .at() 更新现有值,以及如何使用 [] 和 .insert() 创建新条目。最后,它使用基于范围的 for 循环显示更新后的员工及其当前年龄列表。

向 Map 添加元素

可以使用方括号 [] 或 .insert() 函数向 Map 添加元素。

  • 方括号 []: 允许我们将新组件包含到 Map 中或更改现有键的值。如果键不存在,它会创建一个具有给定值的新条目。如果键已存在,它将替换当前值。
  • .insert() 函数: 此方法为 Map 创建新的键值对。它不会覆盖现有键。如果 Map 中已存在该键,则插入将被忽略。当我们希望确保只插入新键而不更改现有键时,它很有用。

C++ 添加 Map 元素示例

让我们通过一个例子来演示 C++ 中向 Map 添加元素的方法。

示例

输出

Student Age Database:
Arjun is 16 years old.
Fatima is 17 years old.
Leo is 16 years old.
Luca is 15 years old.
Meera is 16 years old.
Noah is 17 years old.
Zara is 15 years old.

说明

在此示例中,我们创建了一个 Map,用于存储学生姓名作为键,年龄作为值。它展示了向 Map 添加项目的两种方法:使用方括号 ([]) 添加或编辑条目,以及使用 .insert() 函数添加新条目而不覆盖旧条目。

具有相同键的元素

在 C++ 中,Map 不允许有重复的键。Map 中的每个键都必须是唯一的,这意味着使用 .insert() 函数插入具有现有键的元素将导致操作被忽略。值可能相同,但键必须不同。

C++ 具有相同键的元素示例

让我们通过一个例子来演示 C++ 中具有相同键的元素。

示例

编译并运行

输出

Insertion failed: Key 'John' already exists with score 85
Final Student Marks:
Jacob: 78
John: 95
Joseph: 90

说明

在此示例中,我们使用 Map 来记录学生姓名和成绩,确保每个姓名(键)都是唯一的。它尝试两次插入“John”,但第二次由于键已存在而失败,这由一条消息确认。之后,程序通过直接赋值更改了 John 的分数,并显示了每个学生的最终分数。

从 Map 中移除元素

在 C++ 中,使用 .erase(key) 函数来移除特定元素。之后,调用 .clear() 方法来移除所有元素。这些方法使得在实际应用中管理和更新数据集更加容易。

C++ 移除 Map 元素示例

让我们通过一个例子来演示 C++ 中从 Map 中移除元素的方法。

示例

编译并运行

输出

Original Employee Records:
David: 25
Jacob: 42
John: 36
Joseph: 29
After Removing 'John':
David: 25
Jacob: 42
Joseph: 29
After Clearing All Records:
No records found.

说明

在此示例中,我们创建了一个包含员工姓名和年龄的 Map,然后显示整个列表。它使用 .erase() 函数移除“John”的条目,然后显示修改后的列表。最后,它使用 .clear() 清除所有记录,并使用 .empty() 确保 Map 为空。

查找 Map 的大小

在 C++ 中,Map 的 .size() 函数返回当前存储在其中的键值对的总数。在实时应用程序中,它经常用于计算记录的数量,例如用户、产品和员工。

C++ 查找 Map 大小示例

现在让我们来看一个 C++ 查找 Map 大小的例子。

示例

编译并运行

输出

Total number of employees are: 4

说明

此 C++ 程序将员工 ID 号作为键,将员工姓名作为值存储在标准模板库 (STL) Map 中。使用方括号表示法,它向 Map 添加了四条员工记录。最后,使用 Map 的 .size() 函数,它显示了员工总数。

检查 Map 是否为空

在 C++ 中,.empty() 方法用于确定 Map 是否包含任何键值对。如果 Map 为空,它返回 true (1);否则,它返回 false (0)。同样,.count(key) 函数用于确定给定的键是否存在于 Map 中,如果存在则返回 1,否则返回 0。

C++ 检查 Map 是否为空示例

让我们通过一个例子来演示 C++ 中 Map 是否为空。

示例

编译并运行

输出

The inventory is currently empty.
Inventory empty status: 0
Is 'Laptops' in stock? 1
Is 'Cell Phones' in stock? 0

说明

在此示例中,我们创建了一个名为 inventory 的 Map 来表示库存商品和数量。它首先检查 inventory 是否为空,然后添加三种商品及其各自的数量。最后,.count() 函数用于确定 inventory 是否仍然为空,以及“Laptops”和“Cell Phones”等特定商品是否可用。

遍历 Map

在 C++ 中,我们可以使用基于范围的 for 循环和 auto 关键字来遍历 Map。每个 Map 元素都是一个键值对,可以使用 .first() 函数获取键,使用 .second 获取值。Map 默认按升序对键进行排序,除非另有指定,例如使用 greater 来表示降序。

C++ 遍历 Map 示例

让我们通过一个例子来演示 C++ 中遍历 Map 的方法。

示例

编译并运行

输出

Sanjay attended: 27 days
Prasad attended: 30 days
Akshay attended: 25 days

说明

在此示例中,我们创建了一个名为 check_in 的 Map,用于存储姓名和每个参与者的出勤天数。它使用 greater 按姓名对 Map 进行降序排序。for 循环 auto 遍历 Map,打印每个姓名和出勤次数。

成员函数

以下是 Map 的所有成员函数列表

构造函数/析构函数

给出的表格显示了 C++ Map 中使用的几个构造函数/析构函数。

函数描述
构造函数构造 Map
析构函数Map 析构函数
operator=将 Map 的元素复制到另一个 Map。

迭代器

给出的表格显示了 C++ Map 中使用的几个迭代器函数。

函数描述
begin返回指向 Map 中第一个元素的迭代器。
cbegin返回指向 Map 中第一个元素的 const 迭代器。
end返回指向 past-end 的迭代器。
cend返回指向 past-end 的 const 迭代器。
rbegin返回指向末尾的反向迭代器。
rend返回指向开头的反向迭代器。
crbegin返回指向末尾的 const 反向迭代器。
crend返回指向开头的 const 反向迭代器。

容量

给出的表格显示了 C++ Map 中使用的几个容量函数。

函数描述
empty如果 Map 为空,则返回 true。
大小返回 Map 中元素的数量。
max_size返回 Map 的最大大小。

元素访问

给出的表格显示了 C++ Map 中使用的几个元素访问函数。

函数描述
operator[]检索具有给定键的元素。
at检索具有给定键的元素。

修饰符

给出的表格显示了 C++ Map 中使用的几个修改函数。

函数描述
insert将元素插入 Map 中。
erase从 Map 中删除元素。
swap交换 Map 的内容。
clear删除 Map 的所有元素。
emplace在 Map 中构造并插入新元素。
emplace_hint通过提示在 Map 中构造并插入新元素。

观察器

给出的表格显示了 C++ Map 中使用的几个修改函数。

函数描述
key_comp返回键比较对象的副本。
value_comp返回值比较对象的副本。

操作

给出的表格显示了 C++ Map 中使用的几个操作函数。

函数描述
find搜索具有给定键的元素。
count获取与给定键匹配的元素数量。
lower_bound返回指向下界的迭代器。
upper_bound返回指向界限的迭代器。
equal_range返回与给定键匹配的元素范围。

分配器

给出的表格显示了 C++ Map 中使用的几个分配器函数。

函数描述
get_allocator返回用于构造 Map 的分配器对象。

非成员重载函数

给出的表格显示了 C++ Map 中使用的几个非成员重载函数。

函数描述
operator==检查两个 Map 是否相等。
operator!=检查两个 Map 是否相等。
operator<检查第一个 Map 是否小于另一个 Map。
operator<=检查第一个 Map 是否小于或等于另一个 Map。
operator>检查第一个 Map 是否大于另一个 Map。
operator>=检查第一个 Map 是否大于或等于另一个 Map。
swap()交换两个 Map 的元素。

C++ Map 选择题

1) 在 C++ 中,哪个函数用于检查 std::map 是否为空?

  1. .count()
  2. .clear()
  3. .size()
  4. .empty()
 

答案: d) .empty()


2) 下列哪个函数会返回 C++ Map 中包含特定键的条目数?

  1. .count()
  2. .find()
  3. .at()
  4. .size()
 

答案: a) .count()


3) 在 C++ 中,std::map 的不同元素默认如何排列?

  1. 降序
  2. 随机顺序
  3. 升序。
  4. 用户定义的顺序
 

答案: c) 升序


4) C++ std::map 中 .insert() 函数的目的是什么?

  1. 返回 Map 中的元素数量
  2. 替换现有元素
  3. 清除 Map 中的所有元素
  4. 如果键不存在,则添加新元素
 

答案: d) 如果键不存在,则添加新元素


5) std::greater 仿函数在 std::map 中有什么作用?

  1. 移除大于指定键的元素
  2. 将 Map 按降序排序
  3. 将 Map 按升序排序
  4. 确保所有键都是唯一的
 

答案: b) 将 Map 按降序排序


下一个主题C++ multimap