• boost之string_ref


    前言:

    在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&那样去观察字符串而无法修改字符串,理解这一点非常重要。

    函数用法

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace boost;
    6. void simple()
    7. {
    8. const char* ch="Day of Future Past";
    9. std::string str(ch);//拷贝成本
    10. string_ref s1(ch);
    11. string_ref s2(str);
    12. assert(s1==s2&&s1==ch&&s2==str);
    13. string_ref s3(ch,4);
    14. assert(s3==str.substr(0,4));
    15. // 相当于 string
    16. // 不做过多展示
    17. const char* ch1="Apple iphone ipad";
    18. string_ref str1(ch1);
    19. for(auto& x: str1)
    20. {
    21. std::cout<
    22. }
    23. }
    24. int main()
    25. {
    26. simple();
    27. }

    虽然string_ref不能直接改变原字符串,但它可以使用remove_prefix ()和remove_suffix ()这两个函数调整string_ref内部的字符串指针和长度,达到变动字符串引用的目的——但原始字符串仍然没有被修改:

    由于 string_ref 的接口与 string 完全相同,所以它的一个重要用途是代替 conststd: :string&类型作为函数参数或者返回值,可以完全避免字符串拷贝代价,提高字符串的处理效率。

    1. const char* ch1="Apple iphone ipad";
    2. string_ref str(ch1);
    3. str.remove_prefix(6);
    4. std::cout<
    5. str.remove_suffix(5);
    6. std::cout<
    7. auto trunk=[](string_ref str)->string_ref
    8. {
    9. return str.substr(0,5);
    10. };
    11. std::cout<<trunk("abcdfe")<
    12. //
    13. iphone ipad
    14. iphone
    15. 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