带有打印示例的 C++ 标准模板库 (STL) 中的映射
什么是std::map?
在 C++ 中,一个 MAP 是以映射形式存储项目的关联容器。 map 中的每个 item 都由 key-value 和一个映射的 value 组成。两个映射值不能共享相同的键值。
键值有利于唯一地对元素进行排序和标识。映射值用于存储与键关联的内容。两者在类型上可能不同,但成员类型通过将两者结合的 pair 类型将它们结合起来。
在本 C++ 教程中,您将学习:
- 什么是std::map?
- 为什么要使用 std::map?
- 语法:
- 会员类型:
- 内置函数
- 遍历地图元素
- 在 std::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 数据类型和整数作为值 数据类型。
会员类型:
成员函数可以使用以下成员类型作为参数或返回类型:
- key_type: Key(模板中的第一个参数)
- mapped_type: T(模板中的第二个参数)
- key_compare: 比较(模板中的第三个参数)
- 分配器类型: Alloc(模板中的第四个参数)
- 值类型: 对
- 值比较: 用于比较元素的嵌套函数类
- 参考: allocator_type::reference
- const_reference: allocator_type::const_reference
- 指针: allocator_type::pointer
- 常量指针: allocator_type::const_pointer
- 迭代器: value_type 的双向迭代器
- const_iterator: const value_type 的双向迭代器
- reverse_iterator: 反向迭代器
- const_reverse_iterator: 一个常量反向迭代器
- 差异类型: ptrdiff_t
- 尺寸类型: 尺寸_t
内置函数
std::map 带有内置函数。其中包括:
- 开始()- 此函数将迭代器返回到映射的第一项。
- 尺寸()- 此函数返回地图中的项目数。
- 空()- 该函数返回一个布尔值,表示地图是否为空。
- 插入(对(键,值))- 此函数将新的键值对插入到映射中。
- 查找(val)- 此函数将迭代器提供给 val 元素(如果找到)。否则,它将返回 m.end()。
- 擦除(迭代器位置)- 此函数删除迭代器指向的位置处的项目。
- 擦除(const g) – 此函数从映射中删除键值 g。
- 清除()- 此函数从地图中删除所有项目。
遍历地图元素
您可以遍历地图元素。我们只需要创建一个迭代器并将其用于此目的。
例如:
示例 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; } }
输出:
下面是代码截图:
代码说明:
- 将 iostream 头文件包含到我们的代码中以使用其功能。
- 将字符串头文件包含到我们的代码中以使用其功能。
- 将地图头文件包含到我们的代码中以使用其功能。
- 将 std 命名空间包含到我们的代码中,以便在不调用它的情况下使用它的类。
- 调用 main() 函数。 { 标志着函数体的开始。
- 创建一个名为 Students 的映射,其中键是整数,值是字符串。
- 将值插入地图学生。 200 的键和 Alice 的值将被插入到映射中。
- 将值插入地图学生。键 201 和值 John 将被插入到映射中。
- 使用 size() 函数获取名为 Student 的地图的大小。这应该返回 2。
- 在控制台上打印一些文本。
- 使用 for 循环创建一个名为 it 的迭代器,以迭代名为 Student 的地图元素。
- 在控制台上打印地图学生的值。
- for 循环主体的结尾。
- main() 函数主体的结尾。
在 std::map 中插入数据
您可以使用 insert() 函数将项目输入到 std::map 中。请记住,std::map 键必须是唯一的。
因此,它首先检查每个键是否存在于地图中。如果存在,则不会插入该条目,但它会返回现有条目的迭代器。如果不存在,则插入该条目。
该函数有以下变体:
- 插入(对)- 通过这种变体,键值对被插入到映射中。
- 插入(start_itr, end_itr)- 通过这种变化,条目将被插入到由另一个地图的 start_itr 和 end_itr 定义的范围内。
insert_or_assing() 函数的工作方式与 insert() 函数相同,但如果给定的 key 已经存在于 map 中,则其值将被修改。
示例 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; }
输出:
下面是代码截图:
代码说明:
- 将地图头文件包含到我们的代码中以使用其功能。
- 将 iostream 头文件包含到我们的代码中以使用其功能。
- 将 std 命名空间包含到我们的代码中,以便在不调用它的情况下使用它的类。
- 调用 main() 函数。 { 标志着函数体的开始。
- 创建一个名为 m 的映射,其中键是整数,值是整数。地图中添加了三个条目。
- 在地图 m 中插入一个新条目。键 5 和值 6 将被插入到地图中。
- 试图输入一个已经存在的键。由于映射中已经存在键 1,因此不会进行输入。
- 使用 insert_or_assign() 函数插入或修改现有条目。由于键 1 已经存在,其值将更改为 6。
- 在控制台上打印一些文本。 “\t”字符创建一个水平空间,而“\n”字符将鼠标光标移动到下一行。
- 使用 for 循环创建一个名为 itr 的迭代器,以遍历名为 m 的映射的元素。
- 在控制台上打印地图 m 的值。 “\t”字符在每个键与其对应的值之间创建一个水平空间。相反,“\n”字符在每次迭代后将鼠标光标移动到下一行。
- for 循环体的结尾。
- 程序必须在成功完成后返回值。
- main() 函数主体的结尾。
在地图中搜索
我们可以使用 find() 函数通过键在地图中搜索元素。如果未找到该键,则该函数返回 std::map::end。否则,将返回被搜索元素的迭代器。
示例 2:
#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'; } }
输出:
下面是代码截图:
代码说明:
- 将 iostream 头文件包含到我们的代码中以使用其功能而不会出错。
- 将字符串头文件包含到我们的代码中以使用其功能而不会出错。
- 将地图头文件包含到我们的代码中以使用其功能而不会出错。
- 将 std 命名空间包含到我们的代码中,以便在不调用它的情况下使用它的类。
- 调用 main() 函数。 { 标志着 main() 函数体的开始。
- 创建一个名为 Students 的映射,其键是整数和值字符串。
- 将值插入地图学生。 200 的键和 Alice 的值将被插入到映射中。
- 将值插入地图学生。键 201 和值 John 将被插入到映射中。
- 查找与键 201 关联的值。
- 使用 if 语句检查是否找到了键的值。
- 在控制台上打印键的值以及一些文本。
- if 语句主体的结尾。
- main() 函数主体的结尾。
从地图中删除数据
我们可以使用 erase() 函数从地图中删除一个值。我们只需创建一个指向要删除的元素的迭代器。然后将迭代器传递给 erase() 函数。
示例 3:
#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; }
输出:
下面是代码截图:
代码说明:
- 将 iostream 头文件包含到我们的代码中以使用其功能。
- 将字符串头文件包含到我们的代码中以使用其功能。
- 将地图头文件包含到我们的代码中以使用其功能。
- 将 std 命名空间包含到我们的代码中,以便在不调用它的情况下使用它的类。
- 调用 main() 函数。 { 标志着 main() 函数主体的开始。
- 创建一个名为 my_map 的映射,其键是字符串,值是整数。
- 将值插入地图 my_map。 Cow 的键和 1 的值将被插入到地图中。
- 将值插入地图 my_map。 Cat 的键和 2 的值将被插入到地图中。
- 将值 3 添加到带有狮子键的映射 my_map 中。
- 创建一个迭代器来遍历地图 my_map 以寻找关键的猫。
- 删除迭代器指向的元素。
- 使用迭代器从头到尾遍历地图 my_map 的元素。
- 在控制台打印出地图 my_map 的内容。
- 程序必须在成功完成后返回输出。
- main() 函数主体的结尾。
总结:
- 地图是以映射形式存储项目的关联容器。
- 地图中的每个项目都有一个键值和一个映射值。
- 在一个映射中,两个映射值不能共享键值。
- 键值有助于对元素进行唯一排序和识别。
- 映射的值有助于存储与键关联的内容。
- C++ 映射按排序顺序存储唯一键。
- 为了使用 C++ 映射,我们创建了一个迭代器来迭代元素。
- 使用迭代器,我们可以执行诸如从地图中搜索和删除项目等任务。
C语言