title: Usefulness of KeyEqual in std::unordered_set/std::unordered_map
body: <p>I understand that this may be vague question, but I wonder what are real world cases when custom comparator is useful for hash containers in std.
  I understand it's usefulness in ordered containers, but for hash containers it seems a bit weird. </p>
  
  <p>Reason for this is that hash value for elements that are equal according to comparator needs to be the same, and I believe that in most cases that actually means converting lookup/insert element to some common representation(it is faster and easier to implement). </p>
  
  <p>For example:</p>
  
  <ul>
  <li>set of case insensitive strings: if you want to hash properly you need to uppercase/lowercase the entire string anyway.</li>
  <li>set of fractions(where 2/3 == 42/63): you need to convert 42/63 to 2/3 and then hash that...</li>
  </ul>
  
  <p>So I wonder if someone can provide some real world examples of usefulness of customizing <code>std::unordered_</code> template parameters so I can recognize those patterns in future code I write.</p>
  
  <p>Note 1: "symmetry argument" (<code>std::map</code> enables customization of a comparator so <code>std::unordred_</code>should be customizable also) is something I considered and I do not think it is convincing. </p>
  
  <p>Note 2: I mixed 2 kind of comparators (<code>&lt;</code> and <code>==</code>) in the post for brevity, I know that <code>std::map</code> uses <code>&lt;</code> and <code>std::unordered_map</code> uses <code>==</code>.</p>