《C++ Primer》读书笔记 第三章

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对比激光SLAM与视觉SLAM:谁会成为未来主流趋势?

来源&#xff1a;智车科技摘要&#xff1a;SLAM&#xff08;同步定位与地图构建&#xff09;&#xff0c;是指运动物体根据传感器的信息&#xff0c;一边计算自身位置&#xff0c;一边构建环境地图的过程&#xff0c;解决机器人等在未知环境下运动时的定位与地图构建问题。目前…

链表中的指针

中期答辩改在了国庆之后&#xff0c;终于有时间可以看看剑指offer了。在看到单向链表的部分&#xff0c;对指针&#xff0c;尤其是头指针有点疑惑。首先容易理解的是链表的节点是一个结构体&#xff0c;该结构体包含一个数据&#xff08;一般是int型&#xff09;&#xff0c;还…

实现TFrecords文件的保存与读取

import os import cv2 import numpy as np import tensorflow as tf """ 将train文件夹下的cats和dog文件夹处理成train.tfrecords放在train文件夹里 """ #将图片的路径和对应的标签存储在list中返回 def deal(dir):images []temp []for root,…

工具推荐-css3渐变生成工具

今天工作用到了css3渐变&#xff0c;但是写起来才发现太麻烦了&#xff0c;而却很浪费时间&#xff0c;所以在这里向大家推荐一个在线的css3 渐变生成工具 地址是&#xff1a;http://www.colorzilla.com/gradient-editor/ 这个工具是可视化视图&#xff0c;用起来就和photoshop…

神经网络相关的笔试题目集合(一)

在找工作的过程中发现好多公司没有专门的、传统的图像处理岗位&#xff0c;所以只能参加算法类的笔试甚至AI类的笔试。在AI的笔试中几乎全是关于神经网络的问题&#xff0c;其实也都是很基础的一些问题&#xff0c;如果事先做了准备&#xff0c;可以从容应对。而对于我这种从传…

中美超算“你追我赶” 中国优势可圈可点

来源&#xff1a;新华网摘要&#xff1a;中美超算“你追我赶” 中国优势可圈可点新一期全球超级计算机&#xff15;&#xff10;&#xff10;强榜单&#xff11;&#xff12;日在美国达拉斯发布。与半年前的榜单相比&#xff0c;全球格局变化不大&#xff0c;美国在最快超算上…

吴恩达作业1:逻辑回归实现猫的分类

思路&#xff1a;输入样本X与随机初始权重W相乘&#xff0c;利用sigmoid激活函数输出值&#xff0c;对于二分类问题&#xff0c;用交叉熵损失函数来计算损失值&#xff0c;通过交叉熵损失函数利用链式法则求出W和b的偏导&#xff0c;梯度下降更新W和b即可&#xff0c;&#xff…

《转》不要过打折的生活,当你发现这些你有了,说明你开始成熟了

我在一家外企工作的时候&#xff0c;有一天陪女上司上街选购圣诞礼物。当我们拎着大包小包坐下喝咖啡时&#xff0c;女上司问我&#xff1a;“新年要到了&#xff0c;不买点礼物送给家人&#xff1f;”我笑着说&#xff1a;“我爸妈都很节省&#xff0c;只有不乱花钱&#xff0…

双摄与双目视觉

越来越多的手机开始上双摄&#xff0c;首先解释一下双摄的目的&#xff0c;双摄可以达到什么样的效果。首先双摄可以分为两类&#xff0c;一类是利用双摄获得图像中物体到镜头或者焦距的距离&#xff0c;得到景深信息就可以进行后续的3D重建、图像分割、背景虚化等&#xff1b;…

“脑补”的科学依据:眼前的黑不是黑,靠得是你的大脑

一个在眨眼的婴儿 | 图片来源&#xff1a;Leungcho Pan/Shutterstock撰文&#xff1a;Mindy Weisberger来源&#xff1a;科研圈编译&#xff1a;向菲菲人们常说&#xff1a;“别眨眼&#xff0c;精彩稍纵即逝。”但其实在我们眨眼的时候&#xff0c;精彩仍在我们眼前上演。我们…

基于Sql Server 2008的分布式数据库的实践(三)

配置PHP 1.打开PHP配置文件&#xff0c;找到extensionphp_mssql.dll&#xff0c;将前面的注释符号去掉 2.找到mssql.secure_connection&#xff0c;将Off改为On 3.找到com.allow_dcom true&#xff0c;将前面的注释符号去掉 4.下载正确版本的 ntwdblib.dll (2000.80.194.0)&am…

ORB论文研读与代码实现

首先&#xff0c;ORB算法来自于OpenCV Labs&#xff0c;相比于SIFT和SURF&#xff0c;ORB在使用中不必担心专利的问题。但同时ORB在保证了一定性能的条件下做到了高效。在论文《ORB: An efficient alternative to SIFT or SURF》2011中&#xff0c;ORB在特征点检测和描述子生成…

腾讯发布人工智能辅助翻译,致敬人工翻译

来源&#xff1a;腾讯AI实验室11月13日&#xff0c;深圳 - 腾讯AI Lab今日发布了一款AI辅助翻译产品 - “腾讯辅助翻译”&#xff08;Transmart&#xff09;&#xff0c;可满足用户快速翻译的需求&#xff0c;用AI辅助人工翻译提高效率和质量。该产品采用业内领先的人机交互式机…

吴恩达作业2 利用两层神经网络实现不同颜色点的分类,可更改隐藏层数量

任务&#xff1a;将400个两种颜色的点用背景色分为两类。 前面的还是建议重点学神经网络知识&#xff0c;至于数据集怎么做的后面在深究&#xff0c;首先先看看数据集&#xff0c;代码如下&#xff1a; def load_planar_dataset():np.random.seed(1)m 400 # number of exampl…

linux 学习操作小计

屌丝最近在接触lamp开发 把工作中遇到的 问题和 一些常用的操作记下来。以便以后去翻阅 &#xff08;1&#xff09;linux下备份mysql数据库方法 #mysqldump -u root -p dbname > /root/dbname.sql root 和 dbname 分别是 数据库的用户名 和 数据库名称 路径可以自己随…

利用tensorflow构建AlexNet模型,实现小数量级的猫狗分类(只有train)

首先看路径&#xff1a; data文件夹分为&#xff0c;model文件夹&#xff0c;train文件夹和文件夹&#xff0c;model文件夹存放模型文件&#xff0c;train存放cat和dog的两个文件夹图片&#xff0c; validation和train一样。config.py存放配置的一些参数&#xff0c;util.py定…

脑网络的可塑性——随时都在发生

来源&#xff1a;神经科技前沿神经元的突起是神经元胞体的延伸部分&#xff0c;由于形态结构和功能的不同&#xff0c;可分为树突(dendrite)和轴突(axon)&#xff1b;树突是从胞体发出的一至多个突起&#xff0c;呈放射状。轴突每个神经元只有一根胞体发出轴突的细胞 质部位多呈…

KAZE论文研读

KAZE是发表在ECCV2012的一种特征点检测算法&#xff0c;相比于SIFT和SURF&#xff0c;KAZE建立的高斯金字塔是非线性的尺度空间&#xff0c;采用加性算子分裂算法(Additive Operator Splitting, AOS)来进行非线性扩散滤波。一个很显著的特点是在模糊图像的同时还能保留边缘细节…

简单的线性模型实现tensorflow权重的生成和调用,并且用类的方式实现参数共享

首先看文件路径&#xff0c;line_regression是总文件夹&#xff0c;model文件夹存放权重文件&#xff0c; global_variable.py写了一句话. save_path./model/weight 权重要存放的路径&#xff0c;以weight命名. lineRegulation_model.py代码 import tensorflow as tf "…

comparing ORB and AKAZE

文章全称是《Comparing ORB and AKAZE for visual odometry of unmanned aerial vehicles》。这是一篇来自巴西的文章&#xff0c;没有在百度文库中找到&#xff0c;是在其他博客中给出的链接得到的。从链接的URL可以看出这是一篇来自会议CCIS云计算与智能系统国际会议的文章。…