有没有一种方法可以创建 shorthand 映射以传递给 C++ 中的函数?

Is there a way of creating a shorthand map to be passed to a function in C++?

不知道有没有办法构造一个临时映射来传递,这样可以实现如下:

void func(map<string,int> & input) {
    cout << input["m1"] << endl;  
    cout << input["m2"] << endl;
}

func ( map<string,int>{{"m1",1},{"m2",2}}  ; // causing error when compiled

一般来说,是的,这很容易实现,您只需要让您的 func 接受临时(右值)值。

不需要修改地图,所以

void func(const std::map<string, int>& input) {
    cout << input.at("m1") << endl;  
    cout << input.at("m2") << endl;
}
func({{"m1", 1}, {"m2", 2}});

应该做。

请注意,地图 [] 修改了 地图(如果之前没有键,则插入它并且值是value-initialized)。所以,你不能在 const 引用上使用它。

解决方法是将地图作为特殊的 rval ref 传递,&& :

void func(map<string,int>&& input) {
    cout << input["m1"] << endl;  
    cout << input["m2"] << endl;
}

然而,这并不总是正确的做法,当函数确实不需要修改参数时,我确实更喜欢 const & 方法,因为它实际上使 compile-time 保证这赢了即使在复杂的物体上也会发生。

问题是您试图将右值表达式绑定到 左值引用 non-const std::map.

为了解决这个你可以在参数中添加一个low-level const并使用std::map::find如下图:

void func(const std::map<string, int>& input) {
    auto it1 = input.find("m1");
    
    if(it1!=input.end())
    {
         cout << it1->second << endl; 
    }
    else 
    {
        std::cout<<"element cannot be found"<<std::endl;
    }
    //do the same for other key "m2"    
}
int main()
{
    func({{"m1", 1}, {"m2", 2}});
    return 0;
}

Demo


请注意,如果您只想打印地图的所有元素,您可以在 C++17 中使用 结构绑定,如下所示:

void func(const std::map<string, int>& input) {
    for(const auto&[key, value]: input)
    {
        std::cout<<key<<" --> "<<value<<std::endl;
    }    
}
int main()
{
    func({{"m1", 1}, {"m2", 2}});
    return 0;
}

Demo C++17 & above


请注意,结构绑定可从 C++17 获得,因此如果您使用的是 C++11 或 C++14,则可以使用 range-based for 循环:

void func(const std::map<string, int>& input) {
    for(const auto&element: input)
    {
        std::cout<<element.first<<" --> "<<element.second<<std::endl;
    }  
}

Demo Prior C++17