有条件地分配 std::string 作为引用
Conditionally assign std::string as references
我有一些代码是正在工作的更大函数的一部分。但是,为了优化它并消除不必要的字符串复制需求,我想用引用重写这段代码。我的代码依赖于 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) ;
结构化绑定本身不是变量或引用,但它们避免了副本,并以对您来说似乎很重要的各种方式充当引用。
相关文章:
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 为什么当我使用 std::string::operator[] 时自动变量不会成为引用?
- std::string::find 为取消引用的迭代器和等效字符串文本返回不同的值
- std::shared_ptr<std::string const> 可以作为引用计数的不可变字符串的有效实现吗?
- Cpp 未定义引用 'Apache:: thrift:: transport:: TSocket:: TSocket (std:: string const&, int)'
- 有条件地分配 std::string 作为引用
- 为什么 std::runtime_error 的 c'tor 经常引用 std::string?
- 如何在我的源代码中找到所有发生的情况,其中std :: string被传递给方法作为副本而不是恒定引用
- 我可以在循环中引用 std::string 的一部分并将其放在外面吗?
- C ++如果我使用引用,为什么要清空我的map<string,string>?
- 对"cv::String::allocate(unsigned long)"的未定义引用
- 对'PreconditionViolatedException::PreconditionViolatedException(std::string const&)'的未定义引用
- 链接webrtc本机时出错,因为未定义对具有std::string的方法的引用
- 类型为'std::string&的非常量引用的初始化无效,并且从类型为'std::basic_string<char>的右值
- 在结构的联合成员中使用std::string时,无法引用默认构造函数
- 为什么 std::string 的 back() 应该返回对字符的引用?
- 通过引用传递 std::string 不会更新调用函数中的字符串值
- 为什么解引用string vector迭代器需要括号
- 将非常量向量传递给引用<string> const 向量<const string>?