Usa il metodo lower_bound per cercare il primo elemento che inizia con 3, e incrementa l'iteratore finché la chiave continua ad iniziare con il prefisso; la cosa si può facilmente incapsulare in un paio di funzioni.
codice:
bool startswith(const std::string &s, const std::string &prefix) {
return s.rfind(prefix, 0)==0;
}
template<typename VT>
std::size_t count_prefix(const std::map<std::string, VT> &m, const std::string &prefix) {
std::size_t count=0;
std::map<std::string, VT>::const_iterator it = m.lower_bound(prefix), end=m.end();
while(it!=end && startswith(it->first, prefix)) {
++it;
++count;
}
return count;
}