首页 > 编程语言 >c++ std::string_view

c++ std::string_view

时间:2023-04-05 20:01:11浏览次数:40  
标签:std string c++ 视图 字符串 include view

std::string_view系C++17标准发布后新增的内容。

C++17中我们可以使用std::string_view来获取一个字符串的视图,字符串视图并不真正的创建或者拷贝字符串,而只是拥有一个字符串的查看功能。std::string_view比std::string的性能要高很多,因为每个std::string都独自拥有一份字符串的拷贝,而std::string_view只是记录了自己对应的字符串的指针和偏移位置。当我们在只是查看字符串的函数中可以直接使用std::string_view来代替

std::string_view记录了对应的字符串指针和偏移位置,无需管理内存,相对std::string拥有一份字符串拷贝,如字符串查找和拷贝,效率更高。

#include <iostream>
#include <string>
#include <string_view>
 
int main()
{
 
    const char* cstr = "yangxunwu";
    std::string_view stringView1(cstr);
    std::string_view stringView2(cstr, 4);
    std::cout << "stringView1: " << stringView1 << ", stringView2: " << stringView2 << std::endl;
 
    std::string str = "yangxunwu";
    std::string_view stringView3(str.c_str());
    std::string_view stringView4(str.c_str(), 4);
    std::cout << "stringView3: " << stringView1 << ", stringView4: " << stringView2 << std::endl;
}

输出:

stringView1: yangxunwu, stringView2: yang
stringView3: yangxunwu, stringView4: yang

你可以把原始的字符串当作一条马路,而我们是在马路边的一个房子里,我们只能通过房间的窗户来观察外面的马路。这个房子就是std::string_view,你只能看到马路上的车和行人,但是你无法去修改他们,可以理解你对这个马路是只读的。正是这样std::string_view比std::string会快上很多。

之所以这样时因为std::string在进行操作时会重新分配内存,生成一个对应的std::string副本,大量的new操作。而std::string_view操作,从头到尾其实只有一个字符串数据,其它皆为视图。这也是需要注意的地方,因为std::string_view是原始字符串的视图,如果在查看std::string_view的同时修改了字符串,或者字符串被消毁,那么将是未定义的行为(od)。

#include <iostream>
#include <string>
#include <string_view>
 
std::string_view GetStringView()
{
    std::string name = "xunwu";
 
    return std::string_view(name);  //离开作用域时,name已经被回收销毁
}
 
int main()
{
    std::string_view stringView = GetStringView();
    std::cout << stringView << std::endl;
}

输出 烫烫

 

转载:https://www.cnblogs.com/yangxunwu1992/p/14018837.html

标签:std,string,c++,视图,字符串,include,view
From: https://www.cnblogs.com/Explosion556/p/17290724.html

相关文章

  • java -- Stringbuild、Date和Calendar类
    Stringbuild类由于String类的对象内容不可改变,每次拼接都会构建一个新的String对象,既耗时,又浪费内存空间这时需要通过java提供的StringBuild类解决这个问题StringBuilder又称为可变字符序列,它是一个类似于String的字符串缓冲区,可以看作是一个容器,容器中可以装很多字符串可......
  • c++ struct和class
    c++中对象通常用struct和class表示。在c语言中,struct用来创建结构体,结构体中只能包含基本数据成员。而在c++中struct能包含成员函数,能实现多态(继承)。c++中struct和class的功能十分类似,但是在面向对象的过程中class的使用较多,两者的区别如下:struct与class的主要区别在于默认......
  • C++函数库——全排列
    全排列,顾名思义,对一个无序数组或者有序数组写出其对应的所有组合,实则为从当前数组顺序开始,排列出所有比当前序列大(默认)或者小的所有组合,所以如果初始为无序数组,则得到的结果并非所有组合1.next_permutation,获取下一个排列结果,及获取比当前序列小的下一个序列1#include<iost......
  • c++ std::variant
    std::variant是c++17引入的一个类型,其作用类似于C语言中的Union,但是比Union的功能强大的多。C语言中一个联合体Union可以储存多种类型数据,但缺点有很多。比如:1没有可用的方法来判断Union中真实储存的类型,获取值时也是内存拷贝的结果,可能会存在问题。这就只能靠程序员人脑保证......
  • 2.Visual studio的使用和C++的基础
    visualstudio的基础介绍C++入门编程C++关键字、标识符C++基本数据类型变量的定义visualstudio的基础介绍解决方案资源管理器 也可以在”视图”中找到”解决方案资源管理器” “.h”:头文件;“.cpp”:源文件添加新建项,选择C++语言  运行程序,或"ctrl+F5“ ......
  • C++中的左值和右值
    左值与右值左值和右值有如下3个规则:左值和右值都是表达式。左值是对象定位器,理论上左值指示指示一个对象。右值是一个临时值,其他位置无法访问这个值,通常情况下在语句执行完成后右值就被丢弃。http://c.biancheng.net/view/281.html左值:可以进行取地址的称为左值。右值:不......
  • C++复习-第一天
    C++支持完全面向对象的程序设计,包括面向对象开发的四大特性:封装;抽象;继承;多态。C++封装 C++抽象 C++继承 C++多态多态的实现方式分为三块:重载,重写,重定义。1.重载是指在同一作用域下,具有相同函数名称不同的参数类型,或不同的参数个数,或不同的返回类型。2.重写是指在......
  • C++库封装JNI接口——实现java调用c++
    1.JNI原理概述通常为了更加灵活高效地实现计算逻辑,我们一般使用C/C++实现,编译为动态库,并为其设置C接口和C++接口。用C++实现的一个库其实是一个或多个类的简单编译链接产物。然后暴露其实现类构造方法和纯虚接口类。这样就可以通过多态调用到库内部的实现类及其成员方法。进一步......
  • 关于我用ai做了一点c++开发这件事
    简介C++一直不是我的主力编程语言,何况众所周知C++学习曲线之陡峭,尽管如此我还是动了挑战一下用ai写一下c++程序的念头,事实证明ai非常高效的帮助我完成了我的目标,在大概7个小时的工作时间里帮助我写完了一个简单的汇编器,我目前主要使用newbing作为ai助手,我们的完整QA如下:QA过程......
  • UE5 修复 C++ 代码里的中文在蓝图中显示为乱码的问题
    1.打开VS2019,依次点击扩展->管理扩展,搜索“UTF8”,安装后源码文件会强制保存为UTF-8。注:可能需要重新保存一下,但是只要保存文件的动作生效就会自动检测-转换编码。 2.使用示例    ......