除了 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 终止的字符串