什么是string_view?


162

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

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

  • 这是正确的吗 ?
  • 规范 const std::string&参数类型应变为string_view
  • 还有string_view要考虑的另一个重要点吗?

4
最后,尽管引入string_view只是一小步,但有人意识到字符串需要不同的语义。
John Z. Li

Answers:


183

任何和所有类型的“字符串引用”和“数组引用”建议的目的都是为了避免复制已经在其他地方拥有并且仅需要非变异视图的数据。该string_view问题是这样的一个建议; 还有更早的被称为string_refarray_ref

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

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

字符串的许多用法并不需要实际拥有这些字符串,并且所讨论的字符串通常已经由其他人拥有。因此,通过避免不必要的副本(考虑可以节省的所有分配和例外),确实有提高效率的潜力。

原始的C字符串遭受的问题是null终止符是字符串API的一部分,因此,如果不更改基础字符串(la strtok),就无法轻松创建子字符串。在C ++中,可以通过单独存储长度并将指针和大小包装到一个类中来轻松解决。

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


19
该船以这种哲学航行reference_wrapper,不是吗?
史蒂夫·杰索普

5
@KerrekSB恐怕我不遵循。您能否在“这种引用视图类具有与标准库其余部分完全不同的所有权语义”这一部分进行扩展?我不清楚:与悬挂的引用/指针有何不同?还是由于插入而使迭代器无效(例如std :: vector)?我们已经遇到了这些问题,对我来说很自然的是,非所有者视图将具有与非所有者指针/引用/迭代器类似的问题。
阿里

5
@Ali:使用任何其他标准库容器时,只需查看使用该容器的代码即可断言代码的正确性。并非如此string_view。(我并不是说您永远不能编写残破的代码。只是残破是本地的。)
Kerrek SB 2013年

6
我很惊讶他们没有std::range从中boost::iterator_range接受-IMO比string_view的想法更好
Charles Salvia

19
@nwp:许多人和语言都对C ++的糟糕的默认设置感到遗憾,他们认为“ const”和“ unshared”应该是默认设置,“ mutable”和“ shared”是显式的,罕见的例外。
Kerrek SB 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.