Как вернуть ссылку из функции при создании копии

0

У меня есть функция, которая возвращает 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;
}

Как я могу избежать копирования строки, возвращающейся из функции выше?

  • 1
    return iter->second;
  • 0
    @BrianBi, что если он не найден?
Показать ещё 5 комментариев
Теги:
map

3 ответа

1
Лучший ответ

Если вы согласны с возвращаемой ссылкой 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 был очищен или изменен, но это обычно не является проблемой на практике.

1

Вы можете вернуть ссылку на существующую строку или создать исключение, если оно не существует. Это легко сделать с помощью метода 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;
}
0

Как и в вашей программе, вы не можете вернуть ссылку на переменную, объявленную внутри функции, потому что, когда функция завершит выполнение, вся переменная, объявленная внутри этой функции, будет освобождена и удалена.

Таким образом, в этом случае вы получите значение 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>.

Надеюсь, что это поможет вам.

  • 1
    Второй подход приведет к аварии.
  • 0
    @Vinay Я отредактировал ответ, пожалуйста, проверьте

Ещё вопросы

Сообщество Overcoder
Наверх
Меню