C++ 如何通过制作副本返回函数的引用
我有一个函数,如果C++ 如何通过制作副本返回函数的引用,c++,map,C++,Map,我有一个函数,如果map中存在键,则返回值,如: map<int,string> mymap; //Assume there are some key value pair in above map string & ReturnKey(int &a) { string ret; map<int,string>::iterator iter = mymap.find(a); if(iter not_eq mymap.end())
map
中存在键,则返回值
,如:
map<int,string> mymap;
//Assume there are some key value pair in above map
string & ReturnKey(int &a)
{
string ret;
map<int,string>::iterator iter = mymap.find(a);
if(iter not_eq mymap.end())
{
ret = iter->second;//I think this will make copy
}
else
return ret;
}
map-mymap;
//假设上面的映射中有一些键值对
字符串和返回键(int&a)
{
字符串ret;
迭代器iter=mymap.find(a);
if(iter not_eq mymap.end())
{
ret=iter->second;//我想这会复制
}
其他的
返回ret;
}
如何避免复制从上述函数返回的字符串?在您的程序中,无法返回函数内声明变量的引用,因为函数完成执行后,该函数内声明的所有变量都将被释放和删除
因此,在这种情况下,每次调用函数时都会得到null
或垃圾值
在我看来,您可以将字符串参数作为引用传递到函数中。
因此,通过使用它,您可以在变量中获得所需的值
或
您还可以将函数的返回类型更改为std::string
我认为您必须将此功能用作:
map<int,string> mymap;
//Assume there are some key value pair in above map
void ReturnKey(int &a, string& str)
{
map<int,string>::iterator iter = mymap.find(a);
if(iter not_eq mymap.end())
{
str = itr->second;
}
}
应使用#include
希望这能对您有所帮助。您可以返回对现有字符串的引用,如果该字符串不存在,则引发异常。使用以下方法可以轻松完成此操作:
如果您使用的是C++11之前的编译器,则必须手动完成:
string& ReturnKey(int a)
{
map<int,string>::iterator iter = mymap.find(a);
if(iter == mymap.end())
throw std::out_of_range("Invalid key");
return iter->second;
}
string和ReturnKey(int a)
{
迭代器iter=mymap.find(a);
if(iter==mymap.end())
抛出标准::超出范围(“无效密钥”);
返回iter->second;
}
如果您同意返回的引用为const,则可以执行以下操作:
const string & ReturnKey(int a)
{
static const string defaultValue; // to be returned if object isn't found
map<int,string>::iterator iter = mymap.find(a);
if(iter != mymap.end())
{
return iter->second;
}
else return defaultValue;
const字符串和ReturnKey(int a)
{
静态常量字符串defaultValue;//未找到对象时返回
迭代器iter=mymap.find(a);
if(iter!=mymap.end())
{
返回iter->second;
}
否则返回默认值;
}
在未找到的情况下返回对(defaultValue)的引用是安全的,因为defaultValue被声明为静态的,因此在函数返回后仍然存在。在value found的情况下,调用方需要小心不要持有引用,并在mymap被清除或修改后尝试使用它,但这在实践中通常不是问题。return iter->second
@BrianBi如果找不到该怎么办?复制一个空字符串几乎要花很多钱nothing@BrianBi谢谢,所以写上面这样的函数是一个很好的实践,如果找不到键,那么返回一个空对象。实际上,你永远不应该返回对这样的局部变量的引用,因为局部变量在函数完成执行后立即被销毁。第二种方法将导致崩溃。
string& ReturnKey(int a)
{
map<int,string>::iterator iter = mymap.find(a);
if(iter == mymap.end())
throw std::out_of_range("Invalid key");
return iter->second;
}
const string & ReturnKey(int a)
{
static const string defaultValue; // to be returned if object isn't found
map<int,string>::iterator iter = mymap.find(a);
if(iter != mymap.end())
{
return iter->second;
}
else return defaultValue;