在C++中处理字符串的基本工具是标准字符串 std::string,但构造一个std: :string成本较高,因为它必须完全持有字符串的内容,极端的时候会有很高的内存拷贝代价,影响程序效率。使用const std: :string&可以避免一些问题,但它在处理c字符串、提取子串时却又无能为力。总而言之,std: :string 显得有些“重”,我们需要一种更“轻”的字符串工具。
boost.string_ref就是这样一种轻量级的字符串,顾名思义,它只持有字符串的引用,没有内存拷贝成本,所以运行效率很高,是更好的 const std: : string&。它已经被收入C++17标准(但更名为string_view)。
string_ref库位于名字空间 boost,需要包含头文件
#include
using namespace boost;
basic_string_ref的工作原理很简单,它不拷贝字符串,所以也就不分配内存,只用两个成员变量ptr_和 len_标记字符串的起始位置和长度,这样就实现了字符串的表示。
基于ptr_和 len_, basic_string_ref实现了与std: : string 基本一致的接口,例如获取大小、获取字符、取字串、迭代器和比较等等。但需要注意,basic_string_ref是一个字符串的“常量视图”,大部分成员函数都是const修饰的,我们只能像const std: :string&那样去观察字符串而无法修改字符串,理解这一点非常重要。
- #include
- #include
- #include
- #include
- using namespace boost;
-
- void simple()
- {
- const char* ch="Day of Future Past";
- std::string str(ch);//拷贝成本
-
- string_ref s1(ch);
- string_ref s2(str);
-
- assert(s1==s2&&s1==ch&&s2==str);
-
- string_ref s3(ch,4);
- assert(s3==str.substr(0,4));
-
- // 相当于 string
- // 不做过多展示
- const char* ch1="Apple iphone ipad";
- string_ref str1(ch1);
- for(auto& x: str1)
- {
- std::cout<
- }
-
-
- }
- int main()
- {
- simple();
- }
虽然string_ref不能直接改变原字符串,但它可以使用remove_prefix ()和remove_suffix ()这两个函数调整string_ref内部的字符串指针和长度,达到变动字符串引用的目的——但原始字符串仍然没有被修改:
由于 string_ref 的接口与 string 完全相同,所以它的一个重要用途是代替 conststd: :string&类型作为函数参数或者返回值,可以完全避免字符串拷贝代价,提高字符串的处理效率。
- const char* ch1="Apple iphone ipad";
- string_ref str(ch1);
- str.remove_prefix(6);
- std::cout<
- str.remove_suffix(5);
- std::cout<
- auto trunk=[](string_ref str)->string_ref
- {
- return str.substr(0,5);
- };
- std::cout<<trunk("abcdfe")<
-
- //
- iphone ipad
- iphone
- abcdf
使用string_ref还需要加一点小心,因为它持有的是弱引用,必须保证被引用的字符串对象可用,尽量避免长期持有或者延后使用。在确实需要持有或者修改字符串的时候可以调用成员函数to_string()获得一个拷贝来保证安全。
-
相关阅读:
刘畊宏男孩女孩看过来!运动数据分析挖掘!⛵
Spring之BeanFactory
QPushButton样式设置
人工智能|AI作画体验:见识AI绘画,离谱的创造力
数字文档管理不能落后的 5 个原因
《HelloGitHub》第 80 期
IB中文:语言与文学中的非文学语篇
【智能优化算法-战争策略算法】基于战争策略算法求解单目标优化问题附matlab代码
create® 3入门教程-反应Reflexes
25.Xaml DateGrid控件---->默认单选,可以多项选择的网格控件
-
原文地址:https://blog.csdn.net/qq_62309585/article/details/126893881