美文网首页
C++ 17:string_view

C++ 17:string_view

作者: fck_13 | 来源:发表于2020-03-14 01:23 被阅读0次
    • 为什么要增加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::stringstd::string_view 在标准库中定义的函数类似。很方便上手使用。

    • 一些跟std::string 相关的内容

      在C 语言中,字符串是以\0结尾的,所以strlen计算字符串的长度时,实际上就是遍历字符串,直到找到\0,所以,这种情况下,我们对一个字符串的引用,只用一个指针就可以做到。而string_view,无法通过\0来到达所表示的子串的结尾,所以,我们需要一个整型来表示字符串的长度。

    相关文章

      网友评论

          本文标题:C++ 17:string_view

          本文链接:https://www.haomeiwen.com/subject/jzwushtx.html