Re:Mapping Strings in C++
by SoapSeller on Wednesday April 12, 2017 @06:43PM
(#14102422)
You are absolutely right - and the benchmark in the repository doesn't even try to get the value - it's only check for existent of key.
However, it can easily be fixed by using something like vector<tuple<string, types_t>> and supplying predicates for both std::sort and std::lower_bound to only consider the first element in the tuple. There will be some performance hit, but should be minimal.
I see, that makes sense. I guess at that point you have something very much like std::map, except it doesn't keep itself sorted, you have to do it yourself.
I guess for cases like this where you initialize it once and never change it again it could even be a better choice (i.e., faster initialization).
Re:Mapping Strings in C++
by AstralStorm on Thursday April 13, 2017 @07:16AM
(#14105845)
The main difference is that map cannot be reserved ahead of time.
I thought this aswell, but you have it backwards. The point is to convert a string to it's corresponding enum, not the other way around.
I get that part, that's why you use std::find or std::lower_bound on the vector, but my point is that std::lower_bound will not give you the right answer unless your enum is defined with the names in alphabetical order.
> Let’s fix this. An easy way to get our std::vector implementation in-line with the rest of the containers is we can sort it and utilize an algorithm, std::lower_bound, in order to speed up our lookup times.
Unless I'm missing something, isn't this wrong? The point of the vector is that v[enum_value] gives you the name of enum_value as a string. Once you sort it this relationship no longer holds, unless it so happens that the vector was already sorted (which happens to be the case for "circle", "square", "triangle").