有没有一种方法可以创建 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;
}
请注意,如果您只想打印地图的所有元素,您可以在 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;
}
请注意,结构绑定可从 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;
}
}
不知道有没有办法构造一个临时映射来传递,这样可以实现如下:
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;
}
请注意,如果您只想打印地图的所有元素,您可以在 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;
}
请注意,结构绑定可从 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;
}
}