2026/2/3
当函数中传入变量时
直接用 (string a, string b) 语法上可以运行,但在本题的大数据量场景下会导致严重的性能问题,甚至超时;而 const string& 是兼顾 “效率 + 安全性” 的最优写法。
- 为什么要用 &(引用)?—— 避免无意义的拷贝
先理解:函数参数的 “传值” vs “传引用”
传值(string a, string b):当你把字符串传入函数时,C++ 会创建一个全新的副本(把原字符串的所有字符复制一遍)。比如传入一个长度为 1000 的字符串,就会在内存中多存一份 1000 个字符的拷贝。
本题中排序需要 O(n log n) 次比较,每次比较都要拷贝 2 个字符串,假设平均字符串长度是 100,总数据量是 2×10⁵ × log(2×10⁵) × 200 → 几十亿次字符拷贝,必然超时。
额外的拷贝还会占用大量内存,甚至导致内存溢出。
传引用(string& a, string& b):引用相当于给原字符串起了一个 “别名”,函数内部操作的是原字符串本身,没有任何拷贝操作。无论字符串多长,传引用的开销都是固定的(只传递一个内存地址),效率提升几个数量级。
举个直观例子
cpp
运行
// 传值:拷贝开销大
void func1(string s) { /* 操作s / }
// 传引用:无拷贝
void func2(string& s) { / 操作s */ }
int main() {
string big_str(10000, '1'); // 长度10000的字符串
func1(big_str); // 拷贝10000个字符,耗时
func2(big_str); // 仅传递地址,几乎无耗时
return 0;
}
2. 为什么要加 const?—— 保证安全性,避免误修改
传引用虽然高效,但有一个风险:函数内部可能意外修改原字符串(比如手滑写了 a = "000"),而我们的比较函数只需要 “读” 字符串,不需要 “写”。
const 的作用就是限制引用只能读、不能写:
const string& a:表示 “a 是一个字符串的只读引用”。
如果函数内部试图修改 a(比如 a[0] = '1'),编译器会直接报错,提前规避 bug。
反例:无 const 的引用可能出 bug
cpp
运行
bool compare(string& a, string& b) {
a = "000"; // 误修改了原字符串!
return a + b < b + a;
}
int main() {
vector
sort(strs.begin(), strs.end(), compare);
// 原数组已经被函数篡改,结果完全错误
return 0;
}
加了 const 后,a = "000" 这行代码会直接编译失败,从根源避免这类错误。
3. 总结:为什么必须用 const string&?
写法 拷贝开销 是否能修改原字符串 适用场景
string a, string b 极大 不会(修改的是副本) 仅适合极短字符串、小数据
string& a, string& b 无 会(有风险) 需要修改原字符串的场景
const string& a, const string& b 无 不会(安全) 仅读取、不修改的场景
& 是为了效率:避免大量字符串拷贝,适配 2×10⁵ 的大数据量;
const 是为了安全:防止函数内部误修改原字符串,保证排序逻辑的正确性。
简单来说,const string& 是 C++ 中 “只读参数传递” 的标准写法,既高效又安全,是处理字符串、容器等大类型参数的最佳实践。
浙公网安备 33010602011771号