c++ - 如何从集合中初始化 map

标签 c++ stdmap stdset

我想设置 std::map 的按键使用 std::set 的元素(或 std::vector )。

类似下面的内容...

std::set<int> keys = { 3,4,6 };
std::map<int,string> results(keys); // syntax error

这可以在不显式迭代集合的情况下完成吗?

最佳答案

你不能。 map 不是集合。即使底层结构相似,它们也是根本不同的容器。


也就是说,一切皆有可能。如果范围的元素已经排序,则 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);

关于c++ - 如何从集合中初始化 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39801888/

相关文章:

c++ - 在 C++ 中处理许多进程的中央数据缓冲区

c++ - QTextEdit 中的水平线

c++ - 我的代码不适用于 std::map 和 sf::Vector2i

c++ - 为什么标准关联有序容器允许 `const char*` 作为它们的键?

C++:重载 I/O 运算符

c++ - MSVC++ 中的源字符集编码规范,如 gcc "-finput-charset=CharSet"

c++ - 如何以结构体为键将值输入到映射中?

c++ - 将 std::map 项设置为 CListBox 的项数据

c++ - std::set 中的自定义仿函数