点赞、收藏、星标不会错过精彩推送哦!什么是string_v...
点赞、收藏、星标不会错过精彩推送哦!什么是string_viewstd::string_view 是 C++17 引入的一个字符串视图类。它是一个轻量级、非拥有、只读的字符串查看器,可以用于以只读方式访问字符串的连续字符序列,而无需复制字符串数据。python里一切皆对象,包括字符串字面量,std::string_view提供了一种类似于Python字符串对象的方式来处理字符串字面量,但改革得没有python彻底,毕竟还需要构造转换而非编译层面支持。下面是 std::string_view 的一些特性和用法:非拥有性:std::string_view 不拥有字符串数据,它仅仅是对现有字符串的引用或视图。这意味着它不负责管理字符串的生命周期,需要确保字符串数据的生存期足够长,防止出现空悬指针的风险。只读性:std::string_view 是只读的,不能修改其所引用的字符串内容。这使得它适用于需要读取字符串内容但不需要修改的场景。轻量级:std::string_view 对象本身非常轻量,通常只包含指向字符串数据的指针和长度信息,因此创建、传递和复制的开销很小。由于 std::string_view 本身已经是一个很小的对象(通常仅仅包含一个指针和一个长度值),因此在大多数情况下,将其作为值传递是高效的,并不比传递引用或指针更昂贵。
C++ std::string_view for better performance: An example use case - nextptr常见用法:std::string_view 可以作为函数参数,允许函数在不复制字符串的情况下处理字符串数据;它还可以用于在算法中查找、比较字符串片段等操作;另外,它还可以用于提取子字符串或字符串片段。std::string提供了一个返回字符串子串的函数,但是每次返回的都是一个新的对象,也需要进行构造。string_view则不会,对于它而言仅仅对通过指针偏移和长度收缩构造一个新的string_view,不涉及内存的重新分配和数据拷贝。#include <iostream>#include <string_view>void PrintStringView(std::string_view sv) { std::cout << "String View: " << sv << std::endl;}int main() { std::string str = "Hello, World!"; std::string_view sv(str); PrintStringView(sv); // 使用 string_view 进行子字符串的提取 std::string_view substr = sv.substr(7, 5); // 从第7个字符开始提取长度为5的子字符串 std::cout << "Substring: " << substr << std::endl; return 0;}在这个例子中,std::string_view 被用作函数 PrintStringView 的参数,允许函数以只读方式访问字符串数据。另外,通过 substr 方法可以提取原始字符串的子字符串。string_view的创建string_view提供了多个构造函数来创建字符串视图对象,以下是其中的几个:默认构造函数: 默认构造函数创建一个空的string_view对象,它不包含任何字符。例如:std::string_view str;从C风格字符串构造: 可以使用指向以空字符结尾的C风格字符串(const char*)或指针和长度(const char*, size_t)来创建string_view对象。例如:std::string_view str("hello world"); 或者 std::string_view str(ptr, len);从STL字符串构造: 可以使用std::string对象或其它STL字符串类型(如std::string_view)来构造string_view对象。例如:std::string str = "hello world"; std::string_view str_view(str);从字符串字面量构造: 可以使用字符串字面量来创建string_view对象,字符串字面量的类型为const char[]。例如:std::string_view str("hello world");拷贝构造函数: string_view提供了一个拷贝构造函数,它可以从另一个string_view对象创建新的对象。例如:std::string_view str_view(copy_str_view);需要注意的是,string_view本身不拥有任何字符串数据,它只是一个对字符串数据的引用。因此,在使用string_view时需要确保所引用的字符串对象在其有效范围内。另外,由于string_view不拥有字符串数据,因此不能修改其所引用的字符串。string_view最后的倔强函数形参究竟该使用const string&还是string_view?传递字符串引用也能达到避免拷贝构造的目的,我还要string_view干嘛?考虑下面的函数:void func(const std::string& s){ std::cout << s << "\n";}std::string s{"乐呵"};func("乐呵");func(s);你觉得上面哪个调用,谁的开销更大?func("乐呵");,这里我们传入的是字符串字面量,它和std::string不是一个类型,这里字符串字面量即数组类型会先隐式转换到指针,然后调用std::string的转换构造函数,构造出一个临时的std::string对象,也就是一个纯右值表达式。const std::string&可以接纯右值表达式,没问题。也是说在传递字符串字面量是,对于const string&会产生一个临时对象。如果使用string_view就不会产生临时对象了,当然要细扣的话string_view自身也是一个临时对象,但是它的代价要低得多。为了这种场景下的这点性能优化,而说服大家使用string_view代替string,我想还是行不通的。总结std::string_view是C++17引入的一个非拥有的字符串视图类型,它提供了一种轻量级的方式来访问现有字符串数据。std::string_view通过避免字符串复制和内存分配,它可以显著提高程序性能,并提供方便的字符串处理能力。但是,在使用过程中需要注意正确管理原始字符串的生命周期,以确保使用的字符串数据有效和安全。endLinux 世界 关注,回复【1024】海量Linux资料赠送精彩文章合集专辑推荐?【专辑】Linux命令与系统?【专辑】shell编程推荐阅读 点击标题可跳转1、Unix从兴盛到衰落鲜为人知的故事2、*受初学者欢迎的Linux系统ubuntu科普3、ubuntu 20.04 界面美化,提高工作舒适度!
Linux 世界我们专注于编程知识和软件设计分享,包括但不限于C/C++、linux开发。偶尔也聊聊程序人生。长按二维码,关注我们免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除。
专业解答各类课程问题、介绍师资和学校情况