Mapping enums
The STL has map and std::unorderd_map to map enums to values. For example:
#include <string>
#include <unordered_map>
enum E
{
e0,
e1,
};
struct Foo
{
Foo()
{
m_umap.emplace(e0, "Test1");
m_umap.emplace(e1, "Test2");
}
std::string Find(E e) const
{
auto it = m_umap.find(e);
return it != m_umap.cend() ? it->second : std::string{};
}
std::unordered_map<E, std::string> m_umap;
};
std::unordered_maps are fast with on average O(c) lookup (besides the hash function). Still it can be more optimal by using an array and use the enum as index:
#include <array>
#include <string>
enum E
{
e0 = 0,
e1,
eEnd,
};
struct Foo
{
Foo()
{
m_a[e0] = "Test1"
m_a[e1] = "Test2"
}
std::string Find(E e) const
{
return m_a[e];
}
std::array<std::string, eEnd> m_a;
};
This is the optimal form since with array's the values are in contiguous memory and the lookup is O(c) without a the need to calculate a hash beforehand.
Other alternatives are using a switch-case or linear lookup in a std::vector.
Some performance measurements with a 10 value enum:
Method | Time (s) |
---|---|
array | 0.32 |
map | 2.40 |
switch-case | 1.11 |
unordered_map | 1.60 |
No comments:
Post a Comment