罗剑锋的C++实战笔记
罗剑锋
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
3798 人已学习
课程目录
已完结 30 讲
0/4登录后,你可以任选4讲全文学习。
课前导读 (2讲)
开篇词 | 把C++从“神坛”上拉下来,这次咱这么学
免费
课前准备 | 搭建实验环境
概论 (5讲)
01 | 重新认识C++:生命周期和编程范式
02 | 编码阶段能做什么:秀出好的code style
03 | 预处理阶段能做什么:宏定义和条件编译
04 | 编译阶段能做什么:属性和静态断言
05 | 面向对象编程:怎样才能写出一个“好”的类?
语言特性 (5讲)
06 | auto/decltype:为什么要有自动类型推导?
07 | const/volatile/mutable:常量/变量究竟是怎么回事?
08 | smart_ptr:智能指针到底“智能”在哪里?
09 | exception:怎样才能用好异常?
10 | lambda:函数式编程带来了什么?
标准库 (4讲)
11 | 一枝独秀的字符串:C++也能处理文本?
12 | 三分天下的容器:恰当选择,事半功倍
13 | 五花八门的算法:不要再手写for循环了
14 | 十面埋伏的并发:多线程真的很难吗?
技能进阶 (4讲)
15 | 序列化:简单通用的数据交换格式有哪些?
16 | 网络通信:我不想写原生Socket
17 | 脚本语言:搭建高性能的混合系统
18 | 性能分析:找出程序的瓶颈
总结篇 (5讲)
19 | 设计模式(上):C++与设计模式有啥关系?
20 | 设计模式(下):C++是怎么应用设计模式的?
21 | 知识串讲(上):带你开发一个书店应用
22 | 知识串讲(下):带你开发一个书店应用
期末测试 | 这些C++核心知识,你都掌握了吗?
结束语 (1讲)
结束语 | 路远,未有穷期
轻松话题 (4讲)
轻松话题(一) | 4本值得一读再读的经典好书
轻松话题(二) | 给你分享我的工作百宝箱
轻松话题(三) | 提高生活质量的App
轻松话题(四) | 真正高效的生活,是张弛有度
罗剑锋的C++实战笔记
15
15
1.0x
00:00/00:00
登录|注册

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

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

认识字符串

对于 C++ 里的字符串类 string,你可能最熟悉不过了,几乎是天天用。但你知道吗?string 其实并不是一个“真正的类型”,而是模板类 basic_string 的特化形式,是一个 typedef:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《罗剑锋的C++实战笔记》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(16)

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

    谢谢!

    作者回复: string会持有所有字符的拷贝,而string_view只有指针和长度。

    比如一个1m的字符串,string就占1m内存,而string_view就几个字节。

    string_view是字符串的轻量级引用,只读,而string是真实的字符串、可以拷贝修改。

    2020-06-01
    1
    4
  • HoshinoKanade
    老師一直在用linux,而我活在windows裡面一大堆wchar之中不能自救。

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

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

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

    2020-05-31
    2
  • Weining Cao
    处理string的话,标准C++的接口实在不够友好,易用。反而第三方库QT的QString用起来就舒服,顺手很多。

    在这方面,python语言的string处理比C++要友好太多。比如最简单的string内子串替换功能,python可以直接str. replace(a,b),但C++的replace函数需要先计算出替换string的起始位置,非常繁琐。

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

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

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

    2020-05-30
    2
  • 李莹
    using namespace std::literals::string_literals;
    编译
    no member named 'literals' in namespace 'std'

    这个是怎么回事。

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

    2020-06-14
    1
    1
  • 栗宝俊
    罗老师,麻烦问下pod赋值知识点,比如:类型A是pod类型,可以执行A a; a={0}; 网上查资料说不允许这种类型,可我本地调试能过,麻烦罗老师能说一下这个知识点么,书上都是讲通过大括号列表初始化,没听过大括号来列表赋值呀?谢谢啦

    作者回复: 我个人感觉这个有点“语言律师”了,我比较喜欢工程实践,像这种语言细节深究起来意义不大,可能只在面试考试时才有用。

    而且这个也可能跟编译器的实现有关,我觉得是可以用花括号初始化的,编译器是最懂C++的,它如果认可那就没问题。

    抱歉不能给你更满意的答复。

    2020-07-08
  • 酸奶啊火龙果
    “在涉及 Unicode、编码转换的时候,尽量不要用 C++,目前它还不太擅长做这种工作,可能还是改用其他语言来处理更好” --- 老师,改用其它语言来处理是指在 C++ 调用其它语言,还是说其它的 C++ 库,这个有什么最佳实践吗

    作者回复: C++虽然也有很多Unicode库,比如iconv,但用起来还是不那么方便,不是太完备。

    而Python等其他语言就支持得很好,所以我个人建议在C++之外用其他语言处理Unicode,然后在C++里只处理纯字符串,尽量不涉及编码转换。

    2020-07-06
  • 颓废人才
    老师您好,在centos 7 ,gcc版本4.8.5环境下使用stl的正则表达式 regex 很容易throw regex_error,网上查阅后说gcc4.9或以上版本才会支持度好。请问一般现在支持C++11的公司项目会使用4.9一下的版本么来发布么?或者说是否可以认为4.9一下的版本对C++11支持度还不算最友好。

    作者回复: 这个可以看gcc网站,里面有各个版本对C++标准的支持程度,里面每一个特性都写的很清楚。

    https://gcc.gnu.org/projects/cxx-status.html#cxx11

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

    作者回复: 字符串转码有一些开源库,好像有icov什么的吧,用起来也比较简单,但各种编码格式的选择还是要小心。

    string_view就是个简单的字符串引用,内部用一个指针和长度来指向原字符串的位置,所以很轻量级,是只读的,用的时候要注意这一点,不能修改,还有引用的字符串必须是有效的。

    2020-06-21
  • robonix
    老师,浮点数是不是不可以比较相等呀?assert(stod("2.0") == 2.0); // 字符串转浮点数

    作者回复: 可以比较,但不精确,一般不这么用,好像有专门的浮点数比较函数吧,我记不清了,因为从来不这么做。

    2020-06-10
  • Geek_1bbd74
    字面量后缀功能看文档是在c++14才开始支持。

    作者回复: 疏忽了,感谢指正。

    2020-06-02
  • this_is_for_u
    关于. data和. c_str得区别,都说是多了个\0,可我看gcc9.2的源码发现它俩没有任何区别啊,都没有\0,不知道自己哪里看错了!

    作者回复: 看gcc源码,很厉害啊。

    这里说的标准里的规定,c_str()必须有\0结尾,而data()则不保证有\0,可以实际写代码试试。

    2020-05-30
    1
  • EncodedStar
    遇到转换类型int转换string或者string转换int时确实觉得麻烦,之前版本没啥好的库函数,都是用sstream来流,或者有一些atoi,itoa,c11又出来stoi(看来前人也是遇到了麻烦)等来进行处理。语言迭代之所以更新,在处理时也是因为遇到的问题比较多,为了更方便而迭代起来。
    正则一般都是用来匹配文件过传过来消息时有效字段时候用的。

    作者回复: regex还是有点重,如果什么都用正则也是挺麻烦的,所以我觉得C++在这方面还应该加强一下,让字符串用起来更方便些。

    2020-05-30
  • SometimesNever
    老师,我想问个之前的智能指针相关的,什么情况不能用智能指针代替裸指针呢?

    作者回复: 对内存占用和效率很敏感,或者必须手工精细管理资源。

    2020-05-30
  • 桐仲康
    请问老师,标准库里自带的stoi函数效率如何呢?

    作者回复: 这个没试过,可以自己写点代码,跑个几十万次测试一下,不过这个函数一般也不会对性能有太大要求吧。

    2020-05-30
收起评论
16
返回
顶部