Actually the compiler is smart enough to do bisection, so the lookup is log(N), like the map (but better because it avoids the red / black tree).

If you do axesNames[static_cast<unsigned int>(s)].label you'll need to check for the boundaries. That said, this is used solely for printouts, so it does not really matter, even a linear loop would do.