第 15 章. 模板 与 std::unordered_map
在本章(即最后一章)中,你将使用查找表来追踪游戏中每种事件类型的发生次数。
你将在游戏过程中统计每种事件的出现频率,并在游戏结束后报告结果。
虽然这种统计不会为游戏本身增添任何功能,但它将向你展示另一个有用的 C++ 容器。
你将使用std::unordered_map来记录每种事件的发生频率,这意味着你需要编写自己的模板来实现查找功能。
掌握查找表并学会编写模板,将为你打下扎实的 C++ 基础。
你可以利用统计结果来验证是否按预期概率触发了各种事件。
你还将学习如何为你的类型预设等号运算符,了解std::pair,并有机会编写另一个访问器。
现在你已经掌握了大量的 C++ 知识,让我们通过几个最后的细节来收尾。
我并没有涵盖所有内容——C++ 是一门庞大的语言——但你已经掌握了编写完整程序所需的知识,并且知道去哪里查找相关信息。
创建查找表
在其他语言中,查找表有时被称为字典。
它们是一种关联容器:即提供快速查找功能的容器。
查找表包含键值对。
你的键将是一个 Event,而值将是计数。
C++ 提供了两种将唯一键映射到唯一值的类型。
较早的容器是std::map,定义在<MAP>头文件中。
该容器使用比较运算对元素进行排序,这使得搜索速度比使用迭代器遍历无序的std::向量更快。
最新的即std::unordered_map,定义在<unordered_map>头文件中。
无序版本采用不同的方法来加快搜索速度。
让我们来看看具体细节。
使用std::unordered_map 时,需按此顺序提供键和值:
std::unordered_map<std::string,int>lookup;
此查找操作将一个std::string映射到一个int。
您可以使用[]运算符获取和设置值:
lookup["Hello"]=1;intcount=lookup["Hello"];
如果该值不存在,你会得到一个默认键。
在这种情况下,[]运算符实际上会插入一个值。
无需先检查键是否存在,这可能很有用。
例如,如果你尝试获取此查找中不存在的项,你会得到零:
intcount=lookup["Goodbye"];
返回计数 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access