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;