Difference between revisions of "Intermediate C++ Game Programming Tutorial 24"
From Chilipedia
(→Tutorial 24.2: The unordered associative containers) |
(→Tutorial 24.2: The unordered associative containers) |
||
Line 122: | Line 122: | ||
* Requirements for the KeyType of an <code>unordered_map</code> / a hash table [https://youtu.be/LsjFAx-dG5I?t=11m56s 11:56] | * Requirements for the KeyType of an <code>unordered_map</code> / a hash table [https://youtu.be/LsjFAx-dG5I?t=11m56s 11:56] | ||
<div class="mw-collapsible-content"> | <div class="mw-collapsible-content"> | ||
− | + | :* There needs to be a working hash function defined for the KeyType | |
− | + | :* There need to be comparison and equality functor definitions for the KeyType | |
</div> | </div> | ||
* Example: map from <code>Vec2</code> class (2D coordinates) to a string [https://youtu.be/LsjFAx-dG5I?t=12m46s 12:46] | * Example: map from <code>Vec2</code> class (2D coordinates) to a string [https://youtu.be/LsjFAx-dG5I?t=12m46s 12:46] | ||
<div class="mw-collapsible-content"> | <div class="mw-collapsible-content"> | ||
− | + | :* In order to make this work, you need to define a hash function and the comparators for <code>Vei2</code> | |
− | + | :* You can implement a comparison/equality functor as a <code>struct</code> that defines a <code>bool operator()( const T& lhs,const T& rhs ) const</code> member function, templated on <code>T</code> | |
− | + | :* Defining a custom hashing function is an art, it requires knowledge of cryptography, abstract algebra, discrete math, etc. | |
− | + | :* Luckily, we don't need this; you can revert to the standard hashing functions for the basic types that make up any custom type | |
</div> | </div> | ||
* Hash combining [https://youtu.be/LsjFAx-dG5I?t=14m25s 14:25] | * Hash combining [https://youtu.be/LsjFAx-dG5I?t=14m25s 14:25] | ||
<div class="mw-collapsible-content"> | <div class="mw-collapsible-content"> | ||
− | + | :* Combining hashes from basic types to create a hash over your custom object | |
− | + | :* Stack Overflow question "How do I combine hash values in C++" give the example as used in the boost library | |
− | + | ::<syntaxhighlight lang="cpp" line> | |
+ | size_t operator()( const _Vec2<T>& vec ) const | ||
+ | { | ||
+ | std::hash<T> hasher; | ||
+ | auto hashx = hasher ( vec.x ); | ||
+ | auto hashy = hasher ( vec.y ); | ||
+ | hashx ^= hashy + 0x9e3779b9 + (hashx << 6) + (hashx >> 2); | ||
+ | return hashx; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | :* You can implement a hashing functor as a <code>struct</code> that defines a member function, templated on <code>T</code>, the basic type of the <code>Vec2</code> coordinates: | ||
*: <code>size_t operator()( const _Vec2<T>& vec ) const</code> | *: <code>size_t operator()( const _Vec2<T>& vec ) const</code> | ||
*: <code>{</code> | *: <code>{</code> |
Revision as of 22:30, 2 February 2020
Associative containers are super useful, both as a convenient fast way to create dictionary or mapping for real-world problems like managing game resources, and as a data structure to help solve more abstract algorithmic computer science problems. And hash tables are fast as balls.
Contents
[hide]Topics Covered
Part 1: ordered associative containers
-
std::map
container interface - Binary tree data structure
-
std::map
key requirements (comparison) -
std::map
gotchas (std::remove_if
andconst
keys) -
std::set
-
std::multimap
andstd::multiset
Part 2: unordered associative containers
- Hash table performance vs. binary tree performance
- Hash table data structure
-
std::unordered_map
key requirements - Hash combining
-
std::unordered_map
bucket interface and hashing policy - When to choose
std::map
overstd::unordered_map
Video Timestamp Index
Tutorial 24.1: The ordered associative containers
[Expand]
- The
std::map<KeyType,ValueType>
class 0:46
- A Binary Tree data structure is used to manage the order of map elements 2:46
- A look at the
std::map
cppreference.com documentation: insert, lookup & find 7:35
- Requirements on KeyType 14:30
-
std::map
cppreference.com documentation continued: erase 15:28
- Two important things to know when working with associative containers 16:04
- The
std::set<KeyType>
class 20:00
- The
std::multimap
andstd::multiset
classes 21:28
- Practical example of a multimap use case 22:30
- Lookup in multimaps 25:21
Tutorial 24.2: The unordered associative containers
[Expand]
- Main difference between ordered/unordered: performance 0:14
- Using an unordered map 1:38
- The Hash Table data structure 3:20
- Requirements for the KeyType of an
unordered_map
/ a hash table 11:56
- Example: map from
Vec2
class (2D coordinates) to a string 12:46
- Hash combining 14:25
- Template Specialization 18:43
- The
std::unordered_map<>
Bucket interface 20:00
- The
std::unordered_map<>
Hash policy interface 21:47
- When to choose
std::map
overstd::unordered_map
? 25:15
- Homework assignment 26:04
Homework Assignment
The homework for this video is to enable use of a custom datatype in unordered_map
hashing over multiple (4) members of that datatype. The solution video is here.