const V *search(const K& k) const { const_iterator it = impl.find(k); if (it == impl.end()) return nullptr; return &it->second; }
void insert(const K& k, V v) { // As far as I can tell, this is the simplest way to // implement move-only insert-with-replacement. iterator it = impl.lower_bound(k); // invariant: if it is valid, it->first >= k if (it != impl.end() && it->first == k) it->second = std::move(v); else it = impl.insert(std::pair<K, V>(std::move(k), std::move(v))).first; return (void)&it->second; }
const_iterator end() const { return impl.end(); }
iterator end() { return impl.end(); }