title: Avoid temporaries in std::map/std::unordered_map lookup with std::string key
body: <p>Consider the following code:</p>
  
  <pre><code>std::map&lt;std::string, int&gt; m1;
  auto i = m1.find("foo");
  
  const char* key = ...
  auto j = m1.find(key);
  </code></pre>
  
  <p>This will create a temporary std::string object for every map lookup. What are the canonical ways to avoid it?</p>