Вы не можете. A 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);
1) Есть ли какой-либо конкретной причине вы хотите? 2) Каковы значения строк значений? – Beta
Я был бы очень удивлен, если бы это было возможно, поскольку доступ к неинициализированным значениям, которые могут возникнуть в результате этого утверждения, не должен быть допустимым поведением. – ApproachingDarknessFish
@Beta: 1) Я хочу создать API, который позволяет ключу указываться кратко (без учета значений). 2) Я хочу, чтобы значение было инициализировано по умолчанию. – nobar