2014-02-20 56 views
0

我有返回value一個功能,如果在map像存在key如何從一個函數返回一個refrence與製作副本

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; 
} 

我怎樣才能避免從上面的函數返回字符串的副本?

+1

'return iter-> second;' – Brian

+0

@BrianBi如果找不到它? – EmptyData

+1

複製一個空字符串幾乎沒有成本 – Brian

回答

1

如果您同意這是很容易與std::map::at方法完成與返回的引用之中常量,你可以做這樣的事情:

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; 

}

這是SA fe在未找到的情況下返回對(defaultValue)的引用,因爲defaultValue被聲明爲static,因此在函數返回後仍然存在。在找到值的情況下,調用者需要注意不要保存引用,並在mymap被清除或修改後嘗試使用它,但實際上這通常不是問題。

0

如同在你的程序中你不能返回在函數內部聲明的變量的引用,因爲當函數完成執行時,該函數中聲明的所有變量將被釋放和刪除。

所以在這種情況下,每次函數調用時都會得到nullgarbage value

對於此我認爲您可以在該函數中使用pass your string argument as a reference。 所以,通過使用這個,你可以在你的變量中獲得你想要的值。

或 您還可以將函數的返回類型更改爲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;   
    } 

} 

或者,您可以爲您的操作的狀態返回std::string值。 如下:

map<int,string> mymap; 
    //Assume there are some key value pair in above map 

    std::string ReturnKey(int &a) 
    { 
     std::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{ 
      delete ret; 
      return null; 
     } 
     return ret;    
    } 

#include <string>應該被使用。

希望這會幫助你。

+1

第二種方法會導致崩潰。 – EmptyData

+0

@Vinay我編輯了答案,請檢查 –

1

您可以返回對現有字符串的引用,或者在不存在的情況下引發異常。

string& ReturnKey(int a) 
{ 
    return mymap.at(a); 
} 

如果你被卡住預先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; 
} 
相關問題