c++如何实现一个std::string_view c++只读字符串视图【实例】

15次阅读

std::String_view是c++17引入的轻量级只读字符串视图,不拥有数据、仅持指针和长度,避免拷贝,适用于函数参数、解析等场景;支持字面量推导、显式构造及substr截取,提供data()、size()、empty()等接口

c++如何实现一个std::string_view c++只读字符串视图【实例】

std::string_view 是 C++17 引入的轻量级只读字符串视图,不拥有字符数据,只持有指向已有字符串的指针和长度。它避免了不必要的内存拷贝,适合函数参数、临时匹配、解析等场景。

基本用法:构造与访问

你可以用 C 风格字符串、std::string、字面量等构造 string_view:

  • 字面量自动推导(推荐):std::string_view sv = "hello";
  • 显式构造:std::string s = "world"; std::string_view sv(s);
  • 指定起始和长度:std::string_view sv2(s.data() + 2, 3); // "rld"

常用成员函数data() 获取原始指针,size()/length() 返回长度,empty() 判空,substr(pos, len) 截取子视图(仍为只读)。

作为函数参数高效传参

替代 const std::string& 或 const char*,兼顾灵活性和性能:

立即学习C++免费学习笔记(深入)”;

void print(std::string_view sv) {     std::cout << """ << std::string(sv) << "" (len=" << sv.size() << ")n"; } 

std::string s = "C++17"; const char* cstr = "rocks"; print(s); // OK:隐式转换 print(cstr); // OK:隐式转换 print("yes!"); // OK:字面量直接绑定

注意:传入的原始字符串生命周期必须长于 string_view 的使用期,否则会悬垂。

常见操作示例:查找与切分

string_view 支持 find、rfind、starts_with(C++20)、ends_with(C++20),也支持手动遍历:

  • 查找子串:size_t pos = sv.find("ll"); // 返回 2
  • 切分路径:auto last_slash = sv.rfind('/'); if (last_slash != sv.npos) sv = sv.substr(last_slash + 1);
  • 忽略大小写比较(需手动):std::equal(sv1.begin(), sv1.end(), sv2.begin(), sv2.end(), [](char a, char b) { return std::tolower(a) == std::tolower(b); });

注意事项与陷阱

string_view 不是万能的“零成本抽象”,使用时需警惕:

  • 它不以 ‘’ 结尾,c_str() 不可用;如需 C 风格接口,得先转 std::string 或确保源数据以 ‘’ 结尾
  • 不能修改内容,也不管理内存 —— 若源字符串提前析构(比如局部 std::string 返回后被销毁),视图将失效
  • 字面量字符串常量生命周期是静态的,安全;但临时 string 构造的 view 要小心作用域(例如 std::string_view{"abc"}.data() 安全,而 std::string_view{std::string("tmp")} 危险)

只要保证底层存储有效,string_view 就是高效、安全、简洁的只读字符串工具。

text=ZqhQzanResources