轻松理解c++17的string_view

轻松理解c++17的string_view

std::string_view 是 C++17 引入的一个轻量级、不拥有(non-owning)的字符串视图类。它的设计初衷是提供一种高效、简便的方法来操作字符串,而不需要复制字符串数据,从而提高性能。以下是 std::string_view 的详细介绍,包括其设计初衷和常见用法。

设计初衷

  1. 高效性std::string_view 提供了一种不需要复制字符串数据的方式来操作字符串。这对于需要传递或处理大量字符串数据的场景非常有用,因为它避免了不必要的内存分配和数据复制。
  2. 简便性:使用 std::string_view 可以避免繁琐的字符指针操作,同时提供类似于 std::string 的接口,使得代码更易读、更易维护。
  3. 兼容性std::string_view 可以与现有的字符串处理代码无缝集成。它可以从 C 风格的字符串(const char*)、std::string 等类型构造,并提供接口与这些类型进行互操作。

常见用法

构造 std::string_view

std::string_view 可以从多种字符串类型构造:

cpp
Copy code
#include <iostream>
#include <string>
#include <string_view>

int main() {
    // 从 C 风格字符串构造
    const char* cstr = "Hello, world!";
    std::string_view sv1(cstr);

    // 从 std::string 构造
    std::string str = "Hello, C++17!";
    std::string_view sv2(str);

    // 从部分字符串构造
    std::string_view sv3(str.c_str(), 5);

    std::cout << sv1 << '\n';
    std::cout << sv2 << '\n';
    std::cout << sv3 << '\n'; // 输出 "Hello"

    return 0;
}
常用操作

std::string_view 提供了类似于 std::string 的接口,可以进行许多常见的字符串操作:

#include <iostream>
#include <string_view>

int main() {
    std::string_view sv = "Hello, string_view!";

    // 获取字符串长度
    std::cout << "Length: " << sv.size() << '\n';

    // 访问字符
    std::cout << "First character: " << sv[0] << '\n';

    // 子串
    std::string_view sv_sub = sv.substr(7, 10);
    std::cout << "Substring: " << sv_sub << '\n';

    // 查找字符
    size_t pos = sv.find('s');
    if (pos != std::string_view::npos) {
        std::cout << "Found 's' at position: " << pos << '\n';
    }

    // 比较
    if (sv == "Hello, string_view!") {
        std::cout << "The strings are equal.\n";
    }

    return 0;
}
作为函数参数

std::string_view 常用作函数参数,因为它可以避免不必要的字符串拷贝,提高函数调用的效率:

#include <iostream>
#include <string_view>

void print_string(std::string_view sv) {
    std::cout << sv << '\n';
}

int main() {
    std::string str = "Hello, efficient world!";
    print_string(str);            // 从 std::string 传递
    print_string("Hello, world!"); // 从 C 风格字符串传递

    return 0;
}

注意事项

  1. 生命周期std::string_view 不拥有它指向的字符串数据。因此,确保 std::string_view 的生命周期不超过它所指向的字符串数据的生命周期是非常重要的,否则会导致未定义行为。
  2. 不可变性std::string_view 视图中的字符串数据是不可变的。它不提供修改字符串数据的接口。如果需要修改字符串数据,应使用 std::string 或其他可变字符串类型。

总结

std::string_view 是一个高效的、不拥有的字符串视图类,设计用于提高字符串处理的性能和简便性。它在不复制字符串数据的情况下,提供了丰富的字符串操作接口,使得字符串处理更高效、代码更简洁。
在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
string_viewstring都是C++ STL中的字符串类型,但它们有着不同的特点和用途。 stringC++中常用的字符串类型,它是一个可变长的字符串容器,可以动态增加或删除字符。它存储的字符串是一个连续的字符数组,可以通过下标或迭代器进行访问和修改。string支持很多字符串操作,如查找、替换、插入、删除、子串等。 string_viewC++17新增的类型,它是一个不可变的字符串视图。它本质上是一个只包含指向原始字符串的指针和长度信息的结构体,它不拥有原始字符串的内存空间,也不会对原始字符串进行修改。它主要用于读取和处理字符串,可以提高程序的效率和安全性。string_view可以用于任何可以转换为const char*的类型,如string、字符数组、字面量等。 下面是string_viewstring的区别和联系: 1. 内存管理方式不同:string拥有自己的内存空间,而string_view不拥有内存空间,只是指向原始字符串的一个视图。 2. 可变性不同:string是可变的,可以修改字符串内容;而string_view是不可变的,只能读取字符串内容。 3. 使用场景不同:string_view主要用于只读操作,可以提高程序效率和安全性,特别是在处理大量字符串时。而string则适用于需要频繁修改字符串的场景。 4. 接口相似:string_viewstring都支持类似的操作,如查找、比较、子串等。 总之,string_viewstring都是C++中常用的字符串类型,它们各有优点和适用场景。在实际编程中,可以根据需要选择合适的字符串类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早睡的叶子

你的鼓励就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值