Patch for VS2012.  Fixing C4146: unary minus operator applied to unsigned type, result still unsigned.
Patch for VS2012. The actual error was C2664.  However, the actual cause is this compiler supports RValue references.  It demands the second argument be float&&/std::string&&.  So, I just removed the templates to let each individual compiler sort it out.
Patch for VS2012.  I don't fully understand this one.  The Debug C++ runtime throws assertions because the erase call invalidates all iterators.  However, we were storing a new iterator?  And there's a loop a few lines below doing something very similar that doesn't throw assertions?  Maybe it has something to do with the std::pair?  Falling back to indexing...