有条件地分配 std::string 作为引用

Conditionally assign std::string as references

本文关键字:引用 string 有条件 分配 std      更新时间:2023-10-16

我有一些代码是正在工作的更大函数的一部分。但是,为了优化它并消除不必要的字符串复制需求,我想用引用重写这段代码。我的代码依赖于 largerStr 是比 smallStr 更长的字符串。我想用参考重写它,但我似乎无法让它工作。如果我尝试在没有显式初始化它们的情况下进行 largerStr 和 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;
}

您可以使用三元运算符来初始化它们。

#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;
}
可以使用

C++17 的结构化绑定声明来解压缩引用的std::tie元组。

auto [largerStr, smallerStr] = str1.length() > str2.length() ?
                               std::tie(str1, str2)          :
                               std::tie(str2, str1)          ;

结构化绑定本身不是变量或引用,但它们避免了副本,并以对您来说似乎很重要的各种方式充当引用。

相关文章: