Great. Just a hint: a map (as any other node-based structure) is not very performance friendly (traversal thrashes memory cache a lot). Try to structure your data so that it is accessed linearly whenever possible i.e. vector of models sorted by the shader is often better than a map.
I recommend this excellent talk from CppCon2014: Efficiency with Algorithms, Performance with Data Structures. The author talks a lot about why structuring your program and managing access patterns is key to performance.