Вы не можете. map
не является set
. Это принципиально разные контейнеры, даже если базовая структура схожа.
Тем не менее, все возможно. Конструктор диапазона std::map
имеет линейное время, если элементы диапазона уже отсортированы, что set
нам гарантирует. Так что все, что вам нужно сделать, это применить трансформатор к каждому элементу, чтобы получить новый диапазон. Проще всего было бы просто использовать что-то вроде boost::make_transform_iterator
(или свернуть самостоятельно):
template <class K, class F
class V = decltype(std::declval<F&>()(std::declval<K const&>()))::second_type>
std::map<K, V> as_map(std::set<K> const& s, F&& f) {
return std::map<K,V>(
boost::make_transform_iterator(s.begin(), f),
boost::make_transform_iterator(s.end(), f));
}
std::map<int,string> results =
as_map(keys, [](int i){
return std::make_pair(i, std::string{});
});
который, если вам всегда нужна инициализация по умолчанию, может просто уменьшить до:
template <class V, class K>
std::map<K, V> as_map_default(std::set<K> const& s) {
auto f = [](K const& k) { return std::make_pair(k, V{}); }
return std::map<K,V>(
boost::make_transform_iterator(s.begin(), f),
boost::make_transform_iterator(s.end(), f));
}
std::map<int,string> results = as_map_default<string>(keys);
person
Barry
schedule
01.10.2016