C++高效使用string_view实现只读字符串视图
std::string_view不拥有字符串数据,仅提供对已有字符串的轻量引用,避免不必要的拷贝。1.可统一处理字符串字面量、std::string、字符数组和子串,构造开销为常量时间。2.必须确保底层字符串生命周期长于视图,否则导致悬空引用。3.支持size()、substr()、find()等只读操作,且substr不复制数据。4.从std::string到std::string_view可隐式转换,反向则需显式深拷贝。5.适用于高效参数传递和字符串解析,如提取文件扩展名。正确使用可显著提升性能。
std::string_view不拥有字符串数据,仅提供对已有字符串的轻量引用,避免不必要的拷贝。1. 可统一处理字符串字面量、std::string、字符数组和子串,构造开销为常量时间。2. 必须确保底层字符串生命周期长于视图,否则导致悬空引用。3. 支持size()、substr()、find()等只读操作,且substr不复制数据。4. 从std::string到std::string_view可隐式转换,反向则需显式深拷贝。5. 适用于高效参数传递和字符串解析,如提取文件扩展名。正确使用可显著提升性能。

在C++17中引入的std::string_view(注意:标准库中是std::string_view,而非std::string_view_c++)是一种轻量级、非拥有式的字符串视图,用于高效地传递和操作只读字符串数据。它不复制底层字符,仅持有指向已有字符串的指针和长度,因此性能极高。
为什么使用 std::string_view?
传统函数如果接受const std::string&作为参数,可能会导致不必要的内存分配或拷贝,尤其是当传入的是字符串字面量或其他非std::string类型时。而std::string_view可以统一处理以下类型:
- 字符串字面量(如
"hello") std::string- 字符数组
- 子串片段
并且全部以常量时间开销完成构造。
基本用法示例
包含头文件并使用:
#include#include void print_sv(std::string_view sv) { std::cout << "内容: " << sv << ", 长度: " << sv.size() << '\n'; } int main() { print_sv("Hello"); // 字符串字面量 std::string str = "World"; print_sv(str); // std::string print_sv(str.substr(0, 3)); // 子串(仍不拷贝原始数据) }
避免悬空视图
关键注意事项:由于std::string_view不拥有数据,必须确保其所引用的字符串生命周期长于视图本身。
std::string_view bad_example() {
std::string temp = "临时对象";
return temp; // 错误!返回后temp被销毁,视图悬空
}
上面代码会导致未定义行为。应确保底层字符串存活时间足够长,例如来自静态字符串、调用方传入参数或长期存在的对象。
与 std::string 的转换
从std::string_view转为std::string会触发深拷贝,仅在需要时进行:
std::string_view sv = "abc"; std::string copied(sv); // 显式拷贝,此时才分配内存
反向则非常便宜:std::string可隐式转换为std::string_view。
常用操作方法
std::string_view支持大部分std::string的只读操作:
sv.size(),sv.empty()sv.data()— 获取原始字符指针sv.substr(pos, len)— 获取子视图(仍无拷贝)sv.remove_prefix(n),sv.remove_suffix(n)— 原地裁剪前后部分sv.find(c)— 查找字符位置
例如提取文件扩展名:
std::string_view get_ext(std::string_view filename) {
size_t pos = filename.rfind('.');
if (pos != std::string_view::npos) {
return filename.substr(pos + 1);
}
return "";
}
基本上就这些。只要注意生命周期管理,std::string_view是提升字符串处理效率的理想工具。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















