从另一个const std::map初始化const std::map的部分

5

我有一个像这样初始化的常量std::map< int, std::string>:

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

然后我想创建另一个 const std::map,它使用第一个映射作为其初始值的一部分,并扩展原始数据。所以我猜它应该是类似于这样:

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

那么第二个映射表将会有三对对应关系。这种情况是否可能呢?
编辑:而且这些映射表是以 extern 声明的。
2个回答

9
不,std::map 没有适合这种情况的构造函数。但是你可以使用一个 lambda 表达式来就地初始化变量。
const auto secondMap = [&firstMap] {
    std::map<int, std::string> map(firstMap);
    map[3] = "Third";
    return map;
}();

有趣的是,您是否了解标准编译器通常如何处理这个与普通const相比?它应该在运行时还是编译时计算?constexpr在这里有用吗? - dmoody256
@Daniel 嗯,你不能将它设为constexpr,因为std::map目前还不支持。是的,初始化将在运行时发生,就像正常的初始化程序被评估一样。 - Rakete1111

5

虽然@Rakete111的答案对你所需的内容完全有效,但我建议将其提升为一个函数。这样,你就可以在多个地方使用它。

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"}});

事实证明,我正在使用一个外部std :: map,该map在给定的实现中定义不同,并且Rakete1111建议的lambda无法绑定到非自动存储类型,因此我选择了定义的函数。然而,对于我的特定问题,两者都可以被认为是正确的。 - dmoody256

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接