The problem is that both implementations have different performance characteristics, and more importantly different iterator/reference invalidation semantics.
For example AFAICT code like this:
m["a"] = m["b"];
is safe when inserting "a" into m causes a resizing with the node-based implementation, but not with the flat one, resulting in UB.
And more generally, code which works fine with the node-based one might break subtly with the flat one.
It can be quite confusing since subtle changes to the key or value types - which can occur for example when compiling with a different compiler/libraries - can cause a change in the underlying implementation used.
Hi!
First, thanks for the amazing work!
I understand the motivation, but I think that having
unordered_map
try to automatically pick between the node and flat implementations is error prone:https://github.com/martinus/robin-hood-hashing/blob/9145f963d80d6a02f0f96a47758050a89184a3ed/src/include/robin_hood.h#L2519
The problem is that both implementations have different performance characteristics, and more importantly different iterator/reference invalidation semantics.
For example AFAICT code like this:
is safe when inserting
"a"
intom
causes a resizing with the node-based implementation, but not with the flat one, resulting in UB.And more generally, code which works fine with the node-based one might break subtly with the flat one.
It can be quite confusing since subtle changes to the key or value types - which can occur for example when compiling with a different compiler/libraries - can cause a change in the underlying implementation used.