当前位置: 首页 > news >正文

c++ std::basic_string_view、std::span使用笔记

c++ std::basic_string_view、std::span使用笔记

      • `std::basic_string_view` (C++17) 和 `std::span` (C++20) 简介
        • 1. `std::basic_string_view` (C++17)
        • 2. `std::span` (C++20)
      • 使用指南
        • `std::basic_string_view` 使用指南
        • `std::span` 使用指南

std::basic_string_view (C++17) 和 std::span (C++20) 简介

1. std::basic_string_view (C++17)

std::basic_string_view 是一个轻量级的非拥有(non-owning)字符串视图类,用于表示一个字符串的只读视图。它不管理内存,只是对现有字符串的引用。

  • 特点:

    • 非拥有:不管理内存,只是对现有字符串的引用。
    • 只读:不能通过 basic_string_view 修改字符串内容。
    • 低成本:构造和操作的开销很低,适合传递字符串参数而不需要拷贝。
  • 使用场景:

    • 需要传递字符串参数而不需要拷贝。
    • 需要高效的字符串操作,如查找、比较等。
  • 简单使用:

    #include <iostream>
    #include <string>
    #include <string_view>
    
    void print_string_view(std::string_view sv) {
        std::cout << "String view: " << sv << std::endl;
    }
    
    int main() {
        std::string str = "Hello, World!";
        const char* cstr = "C-string";
    
        // 基于 std::string 构造
        std::string_view sv1(str);
        print_string_view(sv1);
    
        // 基于 C 字符串构造
        std::string_view sv2(cstr);
        print_string_view(sv2);
    
        // 基于迭代器构造
        std::string_view sv3(str.begin(), str.end());
        print_string_view(sv3);
    
        // 操作接口
        std::cout << "Size: " << sv1.size() << std::endl;
        std::cout << "First character: " << sv1.front() << std::endl;
        std::cout << "Last character: " << sv1.back() << std::endl;
        std::cout << "Substring: " << sv1.substr(0, 5) << std::endl;
    
        return 0;
    }
    
2. std::span (C++20)

std::span 是一个轻量级的非拥有(non-owning)视图类,用于表示一个连续内存区域的视图。它可以是只读或可读写的。

  • 特点:

    • 非拥有:不管理内存,只是对现有内存区域的引用。
    • 可读写:可以通过 span 修改内存区域的内容。
    • 低成本:构造和操作的开销很低,适合传递数组或容器参数而不需要拷贝。
  • 使用场景:

    • 需要传递数组或容器参数而不需要拷贝。
    • 需要高效的数组操作,如遍历、修改等。
  • 简单使用:

    #include <iostream>
    #include <span>
    #include <array>
    #include <vector>
    
    void print_span(std::span<int> s) {
        for (int elem : s) {
            std::cout << elem << " ";
        }
        std::cout << std::endl;
    }
    
    int main() {
        int carr[] = {1, 2, 3, 4, 5};
        std::array<int, 5> arr = {6, 7, 8, 9, 10};
        std::vector<int> vec = {11, 12, 13, 14, 15};
    
        // 基于 C 数组构造
        std::span<int> sp1(carr, 5);
        print_span(sp1);
    
        // 基于 std::array 构造
        std::span<int> sp2(arr);
        print_span(sp2);
    
        // 基于 std::vector 构造
        std::span<int> sp3(vec);
        print_span(sp3);
    
        // 操作接口
        std::cout << "Size: " << sp1.size() << std::endl;
        std::cout << "First element: " << sp1.front() << std::endl;
        std::cout << "Last element: " << sp1.back() << std::endl;
        std::cout << "Element at index 2: " << sp1[2] << std::endl;
    
        // 修改元素
        sp1[2] = 99;
        print_span(sp1);
    
        return 0;
    }
    

使用指南

std::basic_string_view 使用指南
  1. 构造:

    • 基于 std::string 构造:std::string_view sv(str);
    • 基于 C 字符串构造:std::string_view sv(cstr);
    • 基于迭代器构造:std::string_view sv(begin, end);
  2. 操作:

    • 获取大小:sv.size()
    • 获取第一个字符:sv.front()
    • 获取最后一个字符:sv.back()
    • 获取子字符串:sv.substr(pos, count)
    • 查找字符或子字符串:sv.find(ch)sv.find(substr)
  3. 注意事项:

    • basic_string_view 是只读的,不能修改字符串内容。
    • basic_string_view 不管理内存,确保底层字符串在 basic_string_view 使用期间有效。
std::span 使用指南
  1. 构造:

    • 基于 C 数组构造:std::span<int> sp(arr, size);
    • 基于 std::array 构造:std::span<int> sp(arr);
    • 基于 std::vector 构造:std::span<int> sp(vec);
  2. 操作:

    • 获取大小:sp.size()
    • 获取第一个元素:sp.front()
    • 获取最后一个元素:sp.back()
    • 获取指定索引的元素:sp[index]
    • 修改元素:sp[index] = value;
  3. 注意事项:

    • span 是非拥有的,确保底层数组或容器在 span 使用期间有效。
    • span 可以是只读或可读写的,取决于模板参数类型。

通过使用 std::basic_string_viewstd::span,可以在不引入额外内存开销的情况下,高效地操作字符串和数组。

相关文章:

  • SpringAI 调用本地ollama大模型
  • C++:四大强制类型转换
  • Redis7——进阶篇(二)
  • VirtualBox虚拟机转VM虚拟机
  • AIGC(生成式AI)试用 25 -- 跟着清华教程学习 - DeepSeek+DeepResearch让科研像聊天一样简单
  • 2025-03-01 学习记录--C/C++-C语言 使用欧几里得算法(辗转相除法)计算两个整数的最大公约数
  • 【2025年15期免费获取股票数据API接口】实例演示五种主流语言获取股票行情api接口之沪深A股解禁限售数据获取实例演示及接口API说明文档
  • 基于eRDMA实测DeepSeek开源的3FS
  • 【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.2.3案例:电商订单日志每秒10万条写入优化
  • C# OnnxRuntime部署DAMO-YOLO人头检测
  • Spring Boot全局异常处理:“危机公关”团队
  • 【星云 Orbit • STM32F4】04.一触即发:GPIO 外部中断
  • 560.和为 K 的子数组
  • spring boot + vue 搭建环境
  • 【C++】类与对象:深入理解默认成员函数
  • Qt信号和槽
  • uniapp 系统学习,从入门到实战(八)—— Vuex 的使用
  • Oracle删除重复数据保留其中一条
  • C++:volatile、const、mutable关键字
  • SQL-labs less9-12 闯关记录
  • 设计最好的网站/个人网站制作流程
  • 网站ip域名查询/搜索引擎yandex入口
  • 网站刷链接怎么做的/seo技术顾问阿亮
  • Wordpress按钮添加跳转/seo词条
  • wordpress 做小程序/自己怎么优化网站排名
  • 做网站用的字体/网站推广