首页 > 后端开发 > C++ > 正文

c++如何使用std::string_view_c++高效只读字符串视图

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

c++如何使用std::string_view_c++高效只读字符串视图

在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
  • 字符数组
  • 子串片段

并且全部以常量时间开销完成构造。

基本用法示例

包含头文件并使用:

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

#include <string_view>
#include <iostream>

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被销毁,视图悬空
}
登录后复制

上面代码会导致未定义行为。应确保底层字符串存活时间足够长,例如来自静态字符串、调用方传入参数或长期存在的对象。

Tunee AI
Tunee AI

新一代AI音乐智能体

Tunee AI 1104
查看详情 Tunee AI

与 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是提升字符串处理效率的理想工具

以上就是c++++如何使用std::string_view_c++高效只读字符串视图的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号