Да, для этого можно использовать lower_bound, я видел это раньше и использовал вот так.
map_type::iterator it = map.lower_bound(2.3);
if(it != map.begin()) {
--it;
// it now points at the right element
}
На самом деле вернул бы самый большой, но меньший (если это! Если это было в .begin, то нет меньшего ключа. Хорошая идея из комментариев - вернуть .end
, если нет элемента меньше, и упаковать этот материал в функцию:
template<typename Map> typename Map::const_iterator
greatest_less(Map const& m, typename Map::key_type const& k) {
typename Map::const_iterator it = m.lower_bound(k);
if(it != m.begin()) {
return --it;
}
return m.end();
}
template<typename Map> typename Map::iterator
greatest_less(Map & m, typename Map::key_type const& k) {
typename Map::iterator it = m.lower_bound(k);
if(it != m.begin()) {
return --it;
}
return m.end();
}
Шаблон должен работать и для std::set
.