1.注意:头文件不应包含using声明。因为头文件的内容会拷贝到所有引用他的文件中去,对于某些程序来说,由于不经意间包含了一些名字,可能会产生名字冲突。
2.string类型的读入:用cin读入string,忽略所有的前置空格、换行符、tab等,读入串,在此读到这些特殊字符时结束,读入的串中不包含这些特殊字符。getline读入时,一直到换行符结束。
3.auto len = line.size();此时len的类型是string::size_type,size()函数返回一个无符号整形数,因此size_type是一种无符号整数类型,也可显式调用string::size_type a = 0;切记,在调用size()函数时最好不要用int类型,如果在表达式中混用了带符号类型数和无符号类型数有可能会产生意想不到的结果。
4.字面值和string对象相加:当“+”运算符两端至少有一个是string对象时,字符字面值会自动转换成string对象,但两个都是字符字面值时不可以:string s1 = s + "hehe";//正确string s2 = "he" + "he";//不正确 特殊的string s3 = s + "he" + "he";//正确,因为先计算前两个得到一个string对象,在与第三个计算。
5.使用头文件cname和name.h也有不一样的地方,在名为cname的头文件中定义的名字从属命名空间std,而定义在名为.h的头文件中则不然,因此建议使用cname的形式。
6.注意:string和vector []接收下标的类型是string::size_type和vector::size_type,而不是int,带符号整数可以当作下标时会自动转换成size_type类型。
7.特殊的,定义const string s = "hehehehe"; for (auto& c: s) {} //此时c是const char&类型。
8.C++11的新特性,在C++11中,定义嵌套模版类对象时,两个'>'之间不用再加空格了,要知道在以前的C++版本中是要加空格的。
9.vector:在范围for循环内不能改变其所遍历序列的大小,更不能添加元素,但在非范围的for循环中可以。
10.vector初始化:可以使用花括号或圆括号,如果用圆括号,可以说提供的值是用来构造vector对象的,如果用的是花括号,可以表述称列表初始化,花括号中的元素一般作为元素初始值的列表来处理。另一方面,如果初始化时使用了花括号的形式但是提供的值又不能用来列表初始化,就要考虑用这样的值来构造vector对象了,例如:vector<string> v1{10};//有10个默认初始化的元素。vector<string> v2{10,"hehe"};//有10个值为"hehe"的元素
11.vector一种特殊的赋值方式:vector<int> v; v = {1,2,3};//用列表中的元素代替v中的元素。
12.迭代器一般有两种:iterator和const_iterator,后者为常量迭代器,只能读不能写,如果对象是个常量,则只能用iterator,如果是个变量,即能用iterator又能用const_iterator,只不过后者不能写。
13.容器中的begin和end。begin和end的返回的具体类型由对象是否是常量决定,如果对象是常量,则返回const_iterator,否则返回iterator。为了专门得到const_iterator,C++11新标准引入了两个新函数:cbegin和cend。不论vector对象(或string对象)本身是否是常量,返回值都是const_iterator;
14.任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
15.两迭代器的差的类型是名为difference_type的带符号型整数,string和vector都定义了difference_type,因为这个差可正可负,所以是带符号类型的。
16.数组的维度必须是一个常量表达式。另外,定义数组的时候必须指定数组的类别,不允许用auto关键字由初始值的列表推断类型。数组的初始化这里不多说(详见P102,英文版P114)
17.定义数组的指针 int (*p)[10];定义数组的引用 int (&a)[10];特别的int* (&b)[10];b是一个引用,指向一个数组,数组里放了10个指针。
18.在使用数组下标时,通常将其定义为size_t类型,size_t是一机器相关的无符号类型,它被设计的足够大以便能表示内存中任意对象的大小,在cstddef头文件中定义了size_t类型。
19.在函数内定义int a[10];此时数组未初始化,若定义成int a[10]={};则被默认初始化。
20.当使用数组作为一个auto变量的初始值时,推断得到的类型是指针而非数组,但当使用decltype函数时,该函数的返回类型是由10个整数构成的数组。
21.C++11中引入了begin和end函数,也支持数组类型,与容器中的begin和end不同,这两个函数不是成员函数,这两个函数定义在iterator头文件中。
22.这里值得一提的是,若定义一个数组,int a[10]; &a和a的区别是:&a和a都是地址,而且值也相同,但类型不一样,&a是整个数组的地址,而a是数组首元素的地址,因此a与整形指针相容,&a与数组指针相容,&a+1与&a的距离是一个数组的字节数,多维数组也是这样。
23.如果在表达式中含有解引用运算符和点运算符,在必要的地方加上圆括号。 如:(*it).end();
24.如果用整形指针,下标可以为负数,如int a[10]; int *p = a + 2; p[-2] = 1; 虽然标准库类型string和vector也能执行下标运算,但是数组与他们相比还是有所不同,标准库类型限定使用的下标必须是无符号类型,而内置的下标无此要求,内置的下标运算符可以处理负值。
25.在string对象的复合赋值运算中允许使用以空字符结束的字符数组作为右侧的运算对象。
26.若要将string对象的内容赋给一个char*字符串,可以调用string函数c_str(),该函数返回一个字符指针,指向这个string对象的内容,为了确保我们不改变这个字符数组的内容,返回结果为const char*。另外,我们无法保证c_str()函数返回的数组一定有效,事实上,如果后续的操作改变了s的值就可能让之前返回的数组失去效用。
27.vector允许使用数组来初始化vector对象,只需指明要拷贝区域的首元素地址和尾后元素地址就可以了。例如:int a[] = {1,2,3,4,5}; vector<int> v(begin(a),end(a));
28.在多维数组中,如果仅仅想初始化每一行的第一个元素,通过如下的语句即可:int a[3][4]={{0},{3},{4}};
29.使用范围for循环处理多维数组:int a[10][10]; for (auto& row : a) for (auto& col : row) {col=1;},为什么要用引用类型,这里不单单是改变数组元素的缘故,假设写成如下形式:for (auto row : a) for (auto cal : row) {}程序无法通过编译,应该写成如下形式:for (const auto& row : a) for (auto col : row) {} 尽管这个循环中并没有任何写操作,可是我们还是将外层循环的控制变量声明成了引用类型,这是为了避免数组被自动转成指针,像之前一样的第一个循环便利a的所有元素,注意程序元素实际上是大小为4的数组,因为row不是引用类型,所以编译器初始化row时会自动将这些数组形式的元素转换成指向该数组内首元素的指针,这样得到的row的类型就是int*,显然内层的循环就不合法了,编译器将试图在一个int*内遍历,这显然和程序的初衷相去甚远。因此,要使用范围for语句处理多维数组,除了最内层的循环外,其他所以的循环的控制变量都应该是引用类型。

转载于:https://www.cnblogs.com/Chierush/p/3454990.html

《C++ Primer》读书笔记 第三章相关推荐

  1. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

  2. java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略

    java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略 GC需要完成的三件事情:哪些内存需要回收.什么时候回收.如何回收 垃圾回收器在对堆进行回收前,首先要确定那些对象存活,哪些对象已经死去,判断的 ...

  3. Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

    Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...

  4. 《C++ Primer》读书笔记—第三章 字符串、向量和数组

    声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程 这一部分内容比较简单. string表示可变长的字符序 ...

  5. python第三章上机实践_《机器学习Python实践》读书笔记-第三章

    <机器学习Python实践>,第三章,第一个机器学习项目 以往目录:橘猫吃不胖:<机器学习Python实践>读书笔记-第一章​zhuanlan.zhihu.com 书中介绍了一 ...

  6. 《深入理解计算机系统》(CSAPP)读书笔记 —— 第三章 程序的机器级表示

    本章主要介绍了计算机中的机器代码--汇编语言.当我们使用高级语言(C.Java等)编程时,代码会屏蔽机器级的细节,我们无法了解到机器级的代码实现.既然有了高级语言,我们为什么还需要学习汇编语言呢?学习 ...

  7. 《Linux内核设计与实现》读书笔记 第三章 进程管理

    第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...

  8. Effective Java 读书笔记----第三章

    第三章 对于所有通用的方法 主要讲的是对Object类的非final方法(equals,hashCode,toString,clone和finalize)覆盖的一些规则 1.覆盖equals时请遵守通 ...

  9. JavaScript Dom编程艺术(第二版)读书笔记 第三章DOM

    第三章DOM 3.1文档中的DOM的"D" 如果没有document(文档),DOM也就无从谈起.当创建了一个网页并把它加载到Web浏览器中时,Dom就在幕后悄然而生.它把你编写的 ...

  10. Android进阶之光读书笔记——第三章:View体系与自定义View

    第三章 View体系与自定义View 本章将介绍Android中十分重要的View,在多本书中View是必讲的一节,Android群英传就讲了不少的View的知识,那么在这里我们再去复习一遍吧 3.1 ...

最新文章

  1. java 如何只暴露接口_Java并发异步编程,原来十个接口的活现在只需要一个接口就搞定...
  2. 爬虫python需要什么软件-python的爬虫流程是什么?这是编程小白必须要了解的
  3. Makefile 使用总结
  4. 【转】从3个科技公司里学到的57条经验
  5. java xpath 命名空间_【转】玩转 XPath 和缺省命名空间(Default Namespaces)
  6. ArcGIS实验教程——实验三:矢量数据采集与编辑(矢量化)
  7. Pick!闲鱼亿级商品库中的秒级实时选品
  8. Linux 关闭网络管理服务
  9. java怎么用unicode写程序_简单的讲解Java是使用Unicode字符集
  10. 计算机设备维修与及日常保养,电脑主机日常的维护保养计划
  11. 嵌入式系统开发与应用——ARM 开发环境搭建及GPIO控制LED实验
  12. 偶尔娱乐一下应该无妨?
  13. Linux文本处理工具实践
  14. C++偶遇-菱形继承
  15. python在冒号处显示语法错误_python冒号错误语法无效
  16. 使用激光雷达创建地图
  17. R语言作图展示数据集中各样品的TMB,immunescore等
  18. 触发器flip-flop
  19. docker是啥?是干什么的?
  20. vue3.0 子组件调用父组件中的方法

热门文章

  1. 解决后端返回数据中的大数字问题(使用第三方包json-bigint )
  2. LeetCode LCP 33. 蓄水(暴力枚举)
  3. LeetCode 431. 将 N 叉树编码为二叉树(递归/层序)
  4. tc溜溜865手机投屏卡_溜溜 TC Games 官网_专题
  5. 操作系统是计算机的什么管理者,操作系统是计算机资源的管理者
  6. JavaScript中九九乘法表制作
  7. python历史以及基础知识
  8. PAT乙类1008之数组元素循环右移问题
  9. 全栈深度学习第6期: 模型测试和部署
  10. 前端遇上Go: 静态资源增量更新的新实践