罗剑锋的 C++ 实战笔记
罗剑锋
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
34779 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 32 讲
结束语 (1讲)
罗剑锋的 C++ 实战笔记
15
15
1.0x
00:00/00:00
登录|注册

11 | 一枝独秀的字符串:C++也能处理文本?

你好,我是 Chrono。
在第一个单元里,我们学习了 C++ 的生命周期和编程范式。在第二个单元里,我们学习了自动类型推导、智能指针、lambda 表达式等特性。今天,我们又要开始进入一个新的单元了,这就是 C++ 标准库。
以前,“C++”这个词还只是指编程语言,但是现在,“C++”早已变成了一个更大的概念——不单是词汇、语法,还必须要加上完备工整的标准库。只有语言、标准库“双剑合璧”,才能算是真正的 C++。反过来说,如果只单纯用语言,拒绝标准库,那就成了“天残地缺”。
看一下官方发布的标准文档吧(C++14,可以参考这份资料), 全文有 1300 多页,而语言特性只有 400 出头,不足三分之一,其余的篇幅全是在讲标准库,可见它的份量有多重。
而且,按照标准委员会的意思,今后 C++ 也会更侧重于扩充库而不是扩充语言,所以将来标准库的地位还会不断上升。
C++ 标准库非常庞大,里面有各式各样的精巧工具,可谓是“琳琅满目”。但是,正是因为它的庞大,很多人在学习标准库时会感觉无从下手,找不到学习的“突破口”。
今天我就先来讲和空气、水一样,最常用,也是最容易被忽视的字符串,看看在 C++ 里该怎么处理文本数据。

认识字符串

对于 C++ 里的字符串类 string,你可能最熟悉不过了,几乎是天天用。但你知道吗?string 其实并不是一个“真正的类型”,而是模板类 basic_string 的特化形式,是一个 typedef:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《罗剑锋的 C++ 实战笔记》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(29)

  • 最新
  • 精选
  • 禾桃
    string_view 较string的优势,能举个具体例子吗? 我感觉string里也是字符串指针和长度(可以变的长度),这个看不出string_view优势在哪?string可以做哪些string_view做不了的事? 谢谢!

    作者回复: string会持有所有字符的拷贝,而string_view只有指针和长度。 比如一个1m的字符串,string就占1m内存,而string_view就几个字节。 string_view是字符串的轻量级引用,只读,而string是真实的字符串、可以拷贝修改。

    3
    20
  • 1coma
    罗老师也打游戏吗?我听着尼尔的歌看着教程,还以为幻视了。。

    作者回复: 哈哈,前一阵刚玩了尼尔机械纪元,还没来得及开三周目。

    12
  • HoshinoKanade
    老師一直在用linux,而我活在windows裡面一大堆wchar之中不能自救。

    作者回复: 在Windows下写C++确实比较辛苦,不过有vc这个神器,这是Linux比不了的。

    8
  • 李莹
    using namespace std::literals::string_literals; 编译 no member named 'literals' in namespace 'std' 这个是怎么回事。

    作者回复: 字符串后缀s是C++14的特性,C++11没有,需要升级gcc到5.4,然后启用C++14标准。

    2
    4
  • Weining Cao
    处理string的话,标准C++的接口实在不够友好,易用。反而第三方库QT的QString用起来就舒服,顺手很多。 在这方面,python语言的string处理比C++要友好太多。比如最简单的string内子串替换功能,python可以直接str. replace(a,b),但C++的replace函数需要先计算出替换string的起始位置,非常繁琐。

    作者回复: 现在有了regex好了一点,用boost里的string_algo也比较方便。

    4
  • c1rew
    针对std::regex与boost::regex之间的性能差异,以下链接有相应的测试及对应的讨论,供大家参考,可以再根据自己项目的实际使用情况再验证下。 https://www.cnblogs.com/bbqzsl/p/13714008.html https://stackoverflow.com/questions/14205096/c11-regex-slower-than-python

    作者回复: This is great!

    2
    3
  • 涤生
    处理文件名需要分割的时候,特别不方便,Python用一个split函数就够了

    作者回复: 是的,C++在字符串方面缺乏很多基本工具,用正则又显得有点重。

    2
    3
  • TC128
    老师,小结2说尽量不要用UNICODE,但如果用C++写界面(MFC、DirectUI),且软件又需要国际化,这种情况也尽量不用UNICODE吗?还是说换个语言写界面?

    作者回复: 什么事情都不是绝对的,像这种情况就必须用Unicode,但用C++处理还是挺费劲的,其他语言做起来要比C++容易一些。

    2
    3
  • 怪兽
    我很赞同老师说的,字符串在程序中的作用就像人对空气一样,所有我也比较看重。也希望老师对字符串转码方面给点建议,以及稍微讲解一下string_view的一些坑或者注意事项。

    作者回复: 字符串转码有一些开源库,好像有icov什么的吧,用起来也比较简单,但各种编码格式的选择还是要小心。 string_view就是个简单的字符串引用,内部用一个指针和长度来指向原字符串的位置,所以很轻量级,是只读的,用的时候要注意这一点,不能修改,还有引用的字符串必须是有效的。

    2
  • 怪兽
    老师,我在VS2017测试了一下,为什么不使用命名空间也可以使用s后缀? // using namespace std::literals::string_literals; auto str = "hello"s;

    作者回复: 应该是打开了std名字空间吧。

    1
收起评论
显示
设置
留言
29
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部