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

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

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*,兼顾灵活性和性能:

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 不是万能的“零成本抽象”,使用时需警惕:

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

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


# c++  # String  # 常量  # if  # 成员函数  # 字符串常量  # const  # auto  # 字符串  # char  # 风格字符串  # 指针  # 接口  # Length  # len  # 作用域  # 切分  # 也不  # 隐式  # 已有  # 可以用  # 遍历  # 适用于  # 如需  # 要小心  # 不以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何升级到最新版本?(升级指南和步骤)  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  javascript中闭包概念与用法深入理解  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  手机网站制作与建设方案,手机网站如何建设?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何在阿里云部署织梦网站?  如何在宝塔面板中创建新站点?  EditPlus中的正则表达式实战(5)  如何用wdcp快速搭建高效网站?  Laravel怎么实现模型属性的自动加密  EditPlus中的正则表达式 实战(2)  使用C语言编写圣诞表白程序  Android滚轮选择时间控件使用详解  如何在万网自助建站平台快速创建网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  JavaScript常见的五种数组去重的方式  bootstrap日历插件datetimepicker使用方法  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Python并发异常传播_错误处理解析【教程】  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Mybatis 中的insertOrUpdate操作  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  iOS发送验证码倒计时应用  Laravel定时任务怎么设置_Laravel Crontab调度器配置  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何安全更换建站之星模板并保留数据?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel如何配置任务调度?(Cron Job示例)  JS去除重复并统计数量的实现方法  网站制作企业,网站的banner和导航栏是指什么?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  如何在Windows虚拟主机上快速搭建网站?  中山网站推广排名,中山信息港登录入口?  网站优化排名时,需要考虑哪些问题呢?  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  制作公司内部网站有哪些,内网如何建网站?  Laravel distinct去重查询_Laravel Eloquent去重方法  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】