什么是string_view?

时间:2013-12-27 16:10:11

标签: c++ c++17 string-view fundamentals-ts

string_view是C ++库基础知识TS(N3921)中添加到C ++ 17中的建议功能

据我所知,它是一种代表某种字符串“概念”的类型,它是任何类型容器的视图,可以存储可以作为字符串查看的内容。

  • 这是对的吗?
  • 应该是规范的 const std::string&参数类型变为string_view
  • 关于string_view需要考虑另一个重点吗?

2 个答案:

答案 0 :(得分:150)

任何和所有类型的“字符串引用”和“数组引用”提议的目的是避免复制已经拥有在其他地方的数据,并且只需要非变异视图。有问题的string_view就是这样一个提案;还有一些名为string_refarray_ref的早期版本。

这个想法总是存储一对指向第一元素的指针和一些现有数据数组或字符串的大小。

这样的视图句柄类可以通过值廉价传递,并提供廉价的子串操作(可以实现为简单的指针增量和大小调整)。

字符串的许多用法不需要​​实际拥有字符串,并且所讨论的字符串通常已经被其他人拥有。因此,通过避免不需要的副本,可以提高效率(想想你可以节省的所有分配和例外)。

原始C字符串遇到的问题是null终止符是字符串API的一部分,因此您无法轻松创建子字符串而不会改变底层字符串(la strtok)。在C ++中,通过分别存储长度并将指针和大小包装到一个类中,可以很容易地解决这个问题。

我能想到的C ++标准库哲学的一个主要障碍和分歧是,这种“参照视图”类与标准库的其余部分具有完全不同的所有权语义。基本上,标准库中的其他所有内容都是无条件安全和正确的(如果它编译,它是正确的)。对于像这样的引用类,这已不再适用。程序的正确性取决于使用这些类的环境代码。所以这很难检查和教导。

答案 1 :(得分:0)

(2021 年自学)

来自微软的<string_view>

<块引用>

string_view 模板特化系列提供了一种有效的方法,可以将只读、异常安全、非拥有的句柄传递给任何字符串类对象的字符数据,其中序列的第一个元素位于零位置。 (...)

摘自 2018 年 8 月 21 日的 Microsoft C++ 团队博客 std::string_view: The Duct Tape of String Types(检索于 2021 年 4 月 1 日):

<块引用>

string_view 解决了“每个平台和库都有自己的字符串类型”的参数问题。它可以绑定到任何字符序列,因此您可以将函数编写为接受字符串视图:

void f(wstring_view); // string_view that uses wchar_t's

调用它而不关心调用代码使用的是什么字符串类型(并且 > for (char*, length) 参数对只需在它们周围添加 {} ) (...)

(...)

今天,用于传递字符串数据的最常见的“最小公分母”是以空字符结尾的字符串(或者按照标准的说法,以空字符结尾的字符类型序列)。这早在 C++ 之前就已经存在了,并提供了干净的“平面 C”互操作性。但是,char* 及其支持库与可利用代码相关联,因为长度信息是数据的带内属性,容易被篡改。此外,用于分隔长度的空值禁止嵌入空值,并导致要求长度的最常见字符串操作之一与字符串长度成线性。

(...)

每个编程领域都构成了自己的新字符串类型、生命周期语义和接口,但很多文本处理代码并不关心这些。分配整个数据副本来处理只是为了使不同的字符串类型满意对于性能和可靠性来说是次优的。