【问题标题】:initialize part of a const std::map from another const std::map从另一个 const std::map 初始化 const std::map 的一部分
【发布时间】:2018-05-08 16:13:54
【问题描述】:

我有一个 const std::map 像这样初始化:

const std::map< int, std::string > firstMap = {
    { 1, "First" },
    { 2, "Second"}
};

然后我想制作另一个 const std::map,它使用第一个映射作为其初始值的一部分,并且还扩展了原始数据。所以我猜它会类似于这个:

const std::map< int, std::string > secondMap = {
    { <firstMap>},
    { 3, "Third"}
};

所以 secondMap 有三对。这可能吗?

编辑:地图也被声明为外部。

【问题讨论】:

    标签: c++ c++11 initialization stdmap


    【解决方案1】:

    不,std::map 没有合适的构造函数。但是,您可以做的是使用 lambda 来初始化变量。

    const auto secondMap = [&firstMap] {
        std::map<int, std::string> map(firstMap);
        map[3] = "Third";
        return map;
    }();
    

    【讨论】:

    • 有趣的是,与常规 const 相比,您对标准编译器通常如何处理这个问题有任何见解吗?它应该在运行时还是编译时计算? constexpr 在这里有用吗?
    • @Daniel 好吧,你不能做到constexpr,因为std::map 还不支持。是的,初始化将在运行时发生,就像正在评估的普通初始化程序一样。
    【解决方案2】:

    虽然@Rakete111's answer 完全可以满足您的需求,但我建议将其提升为函数。也许你可以在多个地方使用它。

    std::map<int, std:::string> combine(std::map<int, std::string> const& map1,
                                        std::map<int, std::string> const& map2)
    {
       std::map<int, std:::string> res(map1);
       res.insert(map2.begin(), map2.end());
       return res;
    }
    

    然后使用

    const auto secondMap = combine(firstMap,
                                   std::map<int, std::string>{{3, "Third"}});
    

    【讨论】:

    • 事实证明,我使用的是 extern std::map,它为给定的实现定义不同,而 Rakete1111 建议的 lambda 无法绑定到非自动存储类型,所以我选择了定义的函数。但是,对于我的具体问题,两者都可以被认为是正确的。
    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多