C++ 17:string_view
-
为什么要增加
string_view
?考虑一下这种场景,我们有一个字符串,然后我们想获取这个字符串的一个子串,然后对这个子串对一些只读操作,比如输出,与其他字符串比较等。一般情况下,我们会新建一个
std::string
对象,然后新建这个对象的时候会分配内存,然后对分配的内存进行赋值等操作。这是一个比较复杂的操作,那么我们有没有什么方法来简化这个过程呢?C++ 17给出的答案就是std::string_view
。同样获取一个子串,std::string_view
的操作是只保存下一个指针和子串的长度。
也就是说std::string_view
相比较std::string
,在构建子串的时候,省去了分配内存及赋值等操作。我们来看一下下面的代码
#include <iostream> #include <string> #include <string_view> const char *a = "hello world"; int main(){ std::string str1(a, 5); std::string_view str2(a, +5); std::cout<<str1<<std::endl; std::cout<<str2<<std::endl; return 0; }
str1
是一个std::string
对象,它内部维护着一段内存,用来存储“hello”。也就是说,str1
拥有(own)自己的一份“hello”;而str2
内部只是一个指针和一个表示长度的值,这个指针就是a
的值,长度为5
,也就是说,str2
并不实际拥有一个字符串,它只是类似于一种对“hello world”的引用。这也就是为什么std::string_view
的proposal的名字叫做 > string_view : a non-owning reference to a string < 。所以如果简单的回答为什么增加
std::string_view
的话,那就是提高性能。 -
std::string
与std::string_view
在标准库中定义的函数类似。很方便上手使用。 -
一些跟
std::string
相关的内容在C 语言中,字符串是以
\0
结尾的,所以strlen
计算字符串的长度时,实际上就是遍历字符串,直到找到\0
,所以,这种情况下,我们对一个字符串的引用,只用一个指针就可以做到。而string_view,无法通过\0
来到达所表示的子串的结尾,所以,我们需要一个整型来表示字符串的长度。