У меня есть код, который является частью более крупной функции, которая работает. Однако, чтобы оптимизировать его и устранить ненужное копирование строк, я хочу переписать этот код со ссылками. Мой код основан на том, что LargeStr является более длинной строкой, чем smallStr. Я хочу переписать это со ссылками, но я не могу заставить его работать. Если я попытаюсь сделать ссылки более крупными и меньшими без их явной инициализации, компилятор скажет мне, что нужно инициализировать их при объявлении. Если я попытаюсь поместить ее как временную переменную в оператор if, обе переменные будут ссылаться на одну и ту же строку.
Какое лучшее решение?
//str1 and str2 are std::strings
std::string largerStr, smallerStr;
if (str1.length() > str2.length()) {
largerStr = str1;
smallerStr = str2;
} else {
largerStr = str2;
smallerStr = str1;
}
Вы можете использовать std::string_view
, если не изменяете largerStr
/smallerStr
Ссылка не может быть «назначена», ее можно только «инициализировать». Итак, тернарный оператор в ответе Камиля работает.
Вы можете использовать объявление структурированной привязки C++17 для распаковки кортежа ссылок std::tie
.
auto [largerStr, smallerStr] = str1.length() > str2.length() ?
std::tie(str1, str2) :
std::tie(str2, str1) ;
Структурированные привязки сами по себе не являются переменными или ссылками, но они избегают копий и действуют как ссылки во всех отношениях, которые кажутся вам важными.
Вы можете использовать тернарный оператор для их инициализации.
#include <string>
int main() {
std::string str1, str2;
const bool str1_longer = str1.length() > str2.length();
std::string& largerStr = str1_longer ? str1 : str2;
std::string& smallerStr = str1_longer ? str2 : str1;
}
Это фантастика. Это делает именно то, что я хотел, спасибо!
«чтобы оптимизировать его и устранить ненужное копирование строк» -> зачем вам создавать ссылки, использовать передачу по ссылке или передачу по константной ссылке