是否有一种方法来创建一个速记映射传递给一个函数在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

问题是您试图将右值表达式绑定到左值引用到非conststd::map

你可以添加一个低级的参数中的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;
}

演示

注意,如果你只想打印map的所有元素,可以使用结构绑定

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 &以上


注意结构绑定在c++ 17中可用,所以如果你正在使用c++ 11或c++ 14,你可以使用基于范围的for循环:

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

演示c++ 17

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

你不需要修改映射,所以

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

应该做的。

注意,尽管它们很舒适,map[]修改了映射(如果之前没有键,则插入它并将值初始化)。所以,你不能在const引用上使用它。

通过特殊的rval ref,&&:

传递映射的方式
void func(map<string,int>&& input) {
cout << input["m1"] << endl;  
cout << input["m2"] << endl;
}

然而,这样做并不总是正确的,我更喜欢const &方法,当函数确实不需要修改形参时,因为它实际上使编译时保证不会发生这种情况,即使是在复杂的对象上。

相关内容

  • 没有找到相关文章

最新更新