У меня есть функция, которая возвращает value
если на map
существует key
:
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;
}
Как я могу избежать копирования строки, возвращающейся из функции выше?
Если вы согласны с возвращаемой ссылкой 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;
}
Безопасно возвращать ссылку на (defaultValue) в не найденном случае, потому что defaultValue объявляется статическим и, следовательно, все равно будет существовать после возвращения функции. В случае с найденным значением вызывающему абоненту необходимо быть осторожным, чтобы не сохранять ссылку и пытаться использовать ее после того, как mymap был очищен или изменен, но это обычно не является проблемой на практике.
Вы можете вернуть ссылку на существующую строку или создать исключение, если оно не существует. Это легко сделать с помощью метода std::map::at
:
string& ReturnKey(int a)
{
return mymap.at(a);
}
Если вы застряли с компилятором pre-С++ 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;
}
Как и в вашей программе, вы не можете вернуть ссылку на переменную, объявленную внутри функции, потому что, когда функция завершит выполнение, вся переменная, объявленная внутри этой функции, будет освобождена и удалена.
Таким образом, в этом случае вы получите значение null
или garbage 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>
.
Надеюсь, что это поможет вам.
return iter->second;