C++ String_view

28 Aug 2024 | 5 分钟阅读

引言

C++ 中与字符串交互的默认方法称为 std::string,因为它为用户提供了广泛的有用功能。在许多其他字符串操作中,std::string 提供了 字符串操作,包括查找子字符串、比较字符串、连接字符串和切片字符串。但是,每次对 string 执行操作时,std::string 都需要动态分配更多内存以及额外的缓冲区空间。

定义 string_view。

String_view 只能用于查看 string;它不能用于从概念上更改字符串本身。与创建字符串副本不同,创建 string_view 时无需复制数据。在堆空间方面,它也小于 std::string。它仅在 C++ 17 版本中可用,std::string_view 无法更改底层数据。

轻量级的 std::string_view 对象仅引用连续的字符序列,并使用与 std::_string 接口相似的接口提供对字符串或字符串一部分的只读访问。与维护自身字符串副本的 std::string 不同,它提供了对源代码中其他位置定义的字符串的视图。

它有两个成员

_size 和一个指向字符数组开头的 const char*。它引用一个不属于任何人的字符串。它在头文件(#include "string_view")和 std:: 中指定。

我们为什么要使用 std::string_view?

有多种原因可能需要 string_view。其中一些如下:

  1. 当您希望消除 额外副本 时,string_view 会很有帮助。
  2. 构建和复制 String_views 需要更少的内存。当 String_view 从文字量创建时,它不需要动态分配。
  3. 同样,std::string::substr 在生成子字符串时会返回一个新字符串,这可能需要动态分配。为了防止任何更多内存被动态分配,我们可以从字符串中特定位置的地址创建一个 string_view

语法

以下语法用于声明 string_view 对象

通过这样做,字符串 "Hello, world!"string_view 对象引用。

成员

string_view 类创建了以下成员:

  1. data: 对字符串开头的引用。
  2. size: 用于确定字符串的长度。

方法

这些是 string_view 类中可用的方法

begin()

它返回指向字符串开头的指针。

end()

它返回指向字符串末尾的指针。

length()

它返回字符串的长度。

size_t start, size_t end, substr

这是一个新的 string_view 对象,它引用当前字符串的一部分并返回。

compare(const std::string_view& other)

它将当前字符串与另一个 string_view 对象进行比较。

equals(const std::string_view& other)

如果当前字符串匹配另一个 string_view 对象,则返回 true

find(char c)

它返回字符串中给定字符第一次出现的索引。

rfind(char c)

它返回字符串中给定字符最后一次出现的索引。

contains(char c)

如果字符串中存在所请求的字符,则返回 true 值。

std::string_view 实际使用场景

让我们通过一些例子来看看我们是如何实际使用 std::string_view 的;

常量字符串std::string 的一个常见缺点。此程序说明了在使用 std::string 处理常量字符串时出现的问题

输出

Hello !, JavaTpoint
Hello !, JavaTpoint
Hello !, JavaTpoint

说明

结果与预测相符。但是,为了显示 "Hello!, JavaTpoint" 两次,std::string 执行了两次内存开销。然而,在这种情况下,只需要读取文本 ("Hello!, JavaTpoint");不需要写入操作。那么,为什么要反复分配内存来显示字符串呢?C++17 提出了 std::string_view(),它在不向内存添加新对象的情况下提供了 预定义的 char str[] 的视图,以便更有效地处理字符串。

std::string 的问题

通过分配两个不同的字符串变量,在上面的示例中,相同的字符串 str_1 被写入了两次。因此,内存是使用静态内存分配为两个变量 str_2str_3 分配的,这使我们的内存加倍。

使用 std::string_view 的优点

std::string_view 有多种优点。此函数的一些主要优点如下:

更便宜、更轻量

轻量级、成本更低的 std::string_view 的基本目的是提供字符串的视图。无需像在上述示例中所做的那样以低效的方式复制字符串,并且在创建 string_view 时会增加 RAM 的开销。当对所观察的字符串进行更改时,这些更改会立即反映在 std::string_view 中,从而大大提高了字符串复制过程的效率。

更高的效率

std::string_view 优于 const std::string&,因为它消除了在字符串开头必须存在 std::string 对象的需要。std::string_view 由两个元素组成,第一个是 const char*,它指定数组的起始位置,第二个是大小。

支持重要功能

std::string_view 支持对 std::string 执行的大多数基本操作,例如 substr、compare、find重载的比较运算符(例如 ==、> 和 !=)。由于只读是我们的选择,它通常消除了对 std::string 对象声明的需求。

以下是使用 std::string_view 的上述程序的准确源代码:

输出

Hello !, JavaTpoint
Hello !, JavaTpoint
Hello !, JavaTpoint

说明

结果将与上面看到的结果相同,但内存中不会生成字符串 "Hello!, JavaTpoint" 的更多副本。

下面是演示字符类型的 C++ 程序

输出

13
Hello, world!

Std::string_view 示例

下面的示例演示了如何将大多数基于字符串的函数与 std::string_view 结合使用,包括函数 str.compare()、str.back()、str.cend() 和 str.at()

输出

The strings are equal.
The last character of the string is !
The end pointer of the string is 
The character at index 5 is ,

下一个主题C++ 中的匿名对象