地图在 C++ 标准模板库 (STL)

Map 是什么 C++? 语法

In C++,以 MAP 是一个关联容器,以映射形式存储项目。映射中的每个项目由键值和映射值组成。两个映射值不能共享相同的键值。

键值适合对元素进行排序和唯一标识。映射值用于存储与键关联的内容。两者的类型可能不同,但成员类型通过结合两者的配对类型将它们组合在一起。

为什么要使用 std::map?

使用地图的原因如下:

  • std::map 仅按照根据所选排序标准的排序顺序存储唯一键。
  • 使用键搜索元素更容易、更快捷。
  • 每个键仅附加一个元素。
  • std::map 可以用作关联数组。
  • std::map 可以使用二叉树(平衡)实现。

句法

要声明 std::map,请使用以下语法:

std::map<key_datatype, value_datatype>map_name; 
  • - key_datatype 表示地图键的数据类型。
  • - value_datatype 表示与映射键对应的值的数据类型。
  • - map_name 是地图的名称。

例如:

map<string, int> my_map; 

我们声明了一个名为 my_map。地图将有一个字符串 数据类型和整数 价值观 数据类型。

会员类型

成员函数可以使用以下成员类型作为参数或返回类型:

  • 密钥类型: Key(模板中第一个参数)
  • 映射类型: T(模板中的第二个参数)
  • 键比较: 比较(模板中的第三个参数)
  • 分配器类型: Alloc(模板中的第四个参数)
  • 值类型: 一对
  • 值比较: 用于比较元素的嵌套函数类
  • 参考: 分配器类型::reference
  • const_reference: 分配器类型::const_reference
  • 指针: 分配器类型::指针
  • const_pointer(常量指针): 分配器类型::const_pointer
  • 迭代器(iterator): 指向 value_type 的双向迭代器
  • const_iterator(常量迭代器): 指向 const value_type 的双向迭代器
  • 反向迭代器(reverse_iterator): 反向迭代器
  • const_reverse_iterator(反向迭代器): 常数反向迭代器
  • 差异类型: ptrdiff_t
  • 尺码类型: 尺寸_t

std::map 的内置函数

std::map 带有内置函数。其中包括:

  • 开始() - 此函数返回指向映射第一个项目的迭代器。
  • 尺寸() -此函数返回地图中的项目数。
  • 空的() -此函数返回一个布尔值,表示地图是否为空。
  • 插入(对(键,值)) – 该函数将新的键值对插入到映射中。
  • 查找(val) – 如果找到,此函数将迭代器返回到 val 元素。否则,它将返回 m.end()。
  • 擦除(迭代器位置) – 此函数删除迭代器指向的位置的项目。
  • 擦除(const g) – 该函数从映射中删除键值 g。
  • 清除 () -此函数将从地图中删除所有项目。

迭代 Map 元素

您可以迭代地图元素。我们只需创建一个迭代器并使用它即可。
例如:

例如1:

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

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

输出:

迭代 Map 元素

以下是代码截图:

迭代 Map 元素

代码说明:

  1. 将 iostream 头文件包含到我们的代码中以使用其功能。
  2. 将字符串头文件包含到我们的代码中以使用其功能。
  3. 将地图头文件包含到我们的代码中以使用其功能。
  4. 将 std 命名空间包含到我们的代码中以便使用它的类而无需调用它。
  5. 调用 main() 函数。{ 标记函数主体的开始。
  6. 创建一个名为 Students 的映射,其中键是整数,值是字符串。
  7. 将值插入到映射 Students 中。键 200 和值 Alice 将被插入到映射中。
  8. 将值插入到映射 Students 中。键 201 和值 John 将被插入到映射中。
  9. 使用 size() 函数获取名为 Students 的地图的大小。这应该返回 2。
  10. 在控制台上打印一些文本。
  11. 使用 for 循环创建一个名为 it 的迭代器,以迭代名为 Students 的映射的元素。
  12. 在控制台上打印地图学生的值。
  13. for 循环主体的结束。
  14. 主体的结尾 main() 功能。

在 std::map 中插入数据

您可以使用 insert() 函数。请记住,std::map 键必须是唯一的。

因此,它首先检查映射中是否存在每个键。如果存在,则不会插入该条目,但它会返回现有条目的迭代器。如果不存在,则插入该条目。

该函数有以下几种变体:

  • 插入(对) – 通过这种变化,键值对被插入到映射中。
  • 插入(start_itr,end_itr) – 通过这种变化,条目将被插入到另一个映射的 start_itr 和 end_itr 定义的范围内。

- 插入或插入() 函数的工作方式与 insert() 函数,但如果给定的键已经存在于映射中,则其值将被修改。

例如2:

#include <map>
#include <iostream>

using namespace std;

int main() {

	map<int, int> m{ {1,3} , {2,4} , {3,5} };

	m.insert({ 5, 6 });
	m.insert({ 1, 8 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

输出:

在 std::map 中插入数据

以下是代码截图:

在 std::map 中插入数据

代码说明:

  1. 将地图头文件包含到我们的代码中以使用其功能。
  2. 将 iostream 头文件包含到我们的代码中以使用其功能。
  3. 将 std 命名空间包含到我们的代码中以便使用它的类而无需调用它。
  4. 调用 main() 函数。{ 标记函数主体的开始。
  5. 创建一个名为 m 的映射,其中键为整数,值也为整数。映射中已包含三个条目。
  6. 在映射 m 中插入一个新条目。键 5 和值 6 将被插入到映射中。
  7. 尝试对已存在的键进行输入。由于键 1 已存在于映射中,因此不会进行输入。
  8. 使用 insert_or_assign() 函数插入或修改现有条目。由于键 1 已经存在,因此其值将更改为 6。
  9. 在控制台上打印一些文本。“\t”字符创建一个水平空格,而“\n”字符将鼠标光标移动到下一行。
  10. 使用 for循环 创建一个名为 itr 的迭代器来迭代名为 m 的映射中的元素。
  11. 在控制台上打印映射 m 的值。“\t”字符在每个键和其对应的值之间创建一个水平空格。相反,“\n”字符在每次迭代后将鼠标光标移动到下一行。
  12. 循环主体的结束。
  13. 程序成功完成后必须返回值。
  14. 主体的结尾 main() 功能。

在地图中搜索

我们可以使用 find() 函数用于通过键在映射中搜索元素。如果未找到键,则函数返回 std::map::end。否则,将返回搜索到的元素的迭代器。

例如3:

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

输出:

在地图中搜索

以下是代码截图:

在地图中搜索

代码说明:

  1. 将 iostream 头文件包含到我们的代码中以使用其功能而不会出现错误。
  2. 将字符串头文件包含到我们的代码中以便使用其功能而不会出现错误。
  3. 将地图头文件包含到我们的代码中以便使用其功能而不会出现错误。
  4. 将 std 命名空间包含到我们的代码中以便使用它的类而无需调用它。
  5. 调用 main() 函数。{ 标记了函数主体的开始 main() 功能。
  6. 创建一个名为 Students 的映射,其键为整数,值为字符串。
  7. 将值插入到映射 Students 中。键 200 和值 Alice 将被插入到映射中。
  8. 将值插入到映射 Students 中。键 201 和值 John 将被插入到映射中。
  9. 查找与键 201 关联的值。
  10. 使用 if 语句检查是否找到该键的值。
  11. 在控制台上打印密钥的值以及一些文本。
  12. if 语句主体结束。
  13. 主体的结尾 main() 功能。

从地图中删除数据

我们可以使用 erase() 函数来从映射中删除值。我们只需创建一个指向要删除的元素的迭代器。然后,迭代器被传递给 erase() 功能。

例如4:

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

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

输出:

从地图中删除数据

以下是代码截图:

从地图中删除数据

代码说明:

  1. 将 iostream 头文件包含到我们的代码中以使用其功能。
  2. 将字符串头文件包含到我们的代码中以使用其功能。
  3. 将地图头文件包含到我们的代码中以使用其功能。
  4. 将 std 命名空间包含到我们的代码中以便使用它的类而无需调用它。
  5. 调用 main() 函数。{ 标记了函数主体的开始 main() 功能。
  6. 创建一个名为 my_map 的映射,其键为字符串,值为整数。
  7. 将值插入到映射 my_map 中。键为 Cow,值 1 将插入到映射中。
  8. 将值插入到映射 my_map 中。键为 Cat,值 2 将插入到映射中。
  9. 将值 3 添加到映射 my_map 中,并以狮子为键。
  10. 创建一个迭代器来迭代映射 my_map 以寻找键 cat。
  11. 删除迭代器指向的元素。
  12. 使用迭代器从开始到结束迭代映射 my_map 中的元素。
  13. 在控制台上打印出地图my_map的内容。
  14. 程序成功完成后必须返回输出。
  15. 主体的结尾 main() 功能。

总结

  • 地图是一种关联容器,以映射形式存储项目。
  • 映射中的每个项目都有一个键值和一个映射值。
  • 在映射中,两个映射值不能共享键值。
  • 键值有助于对元素进行唯一排序和识别。
  • 映射值有助于存储与密钥相关的内容。
  • C++ map 按排序顺序存储唯一的键。
  • 跟...共事 C++ 映射中,我们创建一个迭代器来迭代元素。
  • 使用迭代器,我们可以执行从地图中搜索和删除项目等任务。