除了 std::string_view 方法之外,std::string_view 比 char* 有啥优势吗?

Posted

技术标签:

【中文标题】除了 std::string_view 方法之外,std::string_view 比 char* 有啥优势吗?【英文标题】:Are there any advantages for std::string_view over char* other than the std::string_view methods?除了 std::string_view 方法之外,std::string_view 比 char* 有什么优势吗? 【发布时间】:2018-05-21 22:40:35 【问题描述】:

除了 std::string_view 方法之外,std::string_view 比 char* 有什么优势吗?

如果不使用string_view 的任何方法,是否有任何理由将char* 重新分解为string_view

【问题讨论】:

这里有几个原因:char* 需要调用 strlen,这是 O(n),而 string_view 可以给你恒定时间的长度(哦,等等,但是这是std::string_view 方法的一部分)。 string_view 可以引用非空终止字符串,char* 通常不能。这个列表可以继续下去。 像往常一样,像这样广泛的问题,答案是,“这取决于” - 具体来说,“取决于你需要做什么。” 【参考方案1】:

char* 只是一个指向字符的指针。要将其解释为字符串,您需要一个长度,可以是显式的(pascal 字符串将其存储在第一个字符之前,或者您可以在其旁边传递长度信息作为另一个参数或结构成员),或者隐式的(空终止)。

字符串视图是上述第二个的抽象。与第一个或第三个不同,它不需要与字符串缓冲区相邻的数据来包含长度信息。这意味着您可以在 O(1) 时间内创建非拥有子字符串而无需复制,这是其他两种方法无法做到的。

确定上面第一种和第二种情况的字符串长度是 O(1) 和 O(n) 用于空终止。这很重要。

字符串视图与一对char*char*与长度配对相比没有根本优势;与这些相比,您获得的只是实用方法。但它与以 null 结尾的字符缓冲区有着根本的不同。

【讨论】:

或者说简单点,char*是一个迭代器; string_view 是一个范围 最后一段是最清楚的:std::string_view 就像 char*, char*char*,length 用一些有用的方法封装在一个抽象中。我觉得std::string_view 是每个人都意识到他们需要的东西,因为他们发现在他们曾经在C 中使用char* 的任何地方都使用std::sting,太重并导致太多复制(或向后弯腰防止它)。

以上是关于除了 std::string_view 方法之外,std::string_view 比 char* 有啥优势吗?的主要内容,如果未能解决你的问题,请参考以下文章

返回 const std::string& 的方法应该返回 const std::string_view 吗?

安全地将 std::string_view 转换为 int(如 stoi 或 atoi)

如何将 boost::string_view 转换为 std::string_view?

将 std::string_view 与 api 一起使用,期望以 null 终止的字符串

将 std::string_view 与 api 一起使用,期望以 null 终止的字符串

比较 std::string_view 和子字符串 string_view