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

时间:2019-05-30 05:17:33

标签: c++

我有一些代码是正在运行的较大函数的一部分。但是,为了优化它并消除不必要的字符串复制,我想用引用重写此代码。我的代码依赖于GreaterStr是比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;
}

2 个答案:

答案 0 :(得分:5)

您可以使用三元运算符对其进行初始化。

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

答案 1 :(得分:4)

您可以使用C ++ 17的structured binding declaration来解包std::tie的引用元组。

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

结构化绑定本身并不是变量或引用,但是它们避免了复制,并且在您看来很重要的所有方面都像引用一样起作用。

相关问题