C++Primer第5版学习笔记(二)
C++Primer第5版学习笔记(二)
1.using声明,我知道挺多同学写代码练手都要在源文件前几句直接加using namespace std;然而using语句并不是什么情况都这么使用的,稍后我们将会看到详细的用法。
2.标准库类型string,和C味的字符数组有区别的string,到底是怎么个构造,这章将会讲述。
3.标准库类型vector,vector和数组区别很大,这里将会提到,并引入一个“容器”的重要概念。
4.迭代器,迭代器用来代替下标这种传统方式访问容器或一些支持迭代器的类型。
以下几种初始化语句被string支持:
string s1;//创建了一个空的字符串,对象名为s1,类型为string类型。
string s2(s1);//是s2的值与s1的值相等。
string s2=s1;//同上一句,拷贝初始化。
string s3("value");//直接用字符串字面值初始化string类型的对象。
string s3="value";//字符串字面值转化为string类型变量并赋值给string。
string s4(n,'c');//直接初始化string,操作后s4拥有10个字符,每个字符的值都是'c'。
最后,其实string s5={"value"}和string s3="value"一样,也是合法的。不过大括号初始化是严格检测匹配的,比如int a={3.5};就是错误的。
3.string对象与字符串字面值相加 字符串字面值是字符数组类型,字符串字面值和string类型的对象在一起计算时会被自动转换为string类型。
4.其他支持的操作:包括下标运算符[ ]、重载的+、==、!=、<、>、<=、>=。
范围for语句用于遍历元素。形如:for(一个用于访问序列中基础元素的变量a : 被访问的序列对象b){statement..... blabla;}
首次初始化,变量a的值会被初始化为对象b序列中的第一个元素,迭代之后每次访问下一个元素,直到序列被完全访问结束。
可以使用auto &a的方式声明变量a,使变量绑定到具体的序列元素上,从而进行更改。如在for(auto a : str){}中,每次把a初始化的行为实质上是使a获得str每个元素的副本(拷贝),而for(auto &a : str){}这样的语句则使a成为了str对应的每个元素的"别名",从而可以修改str。
我们可以通过引用头文件<cctype>的形式处理每一个字符。这个头文件包含很多方便处理字符的函数。列举如下:
isalnum(c); //当c是字母或者数字时为真 isalpha(c); //当c是字母时为真
iscntrl(c); //当c是控制字符时为真
isdigit(c); //当c是数字时为真 isgraph(c); //当c不是空格但是可打印时为真
islower(c); //当c是小写字母为真
isprint(c); //当c可打印时为真 isupper(c); //当c是大写字符时为真
isxdigit(c); //当c是16位数字时为真
ispunct(c); //当c是标点符号时为真(一个字符除了控制字符,字母,数字,可打印空白就是标点符号)
isspace(c); //当c是空白时为真(空白包括空格,横向/纵向制表符,回车符,换行符,进纸符)
tolower(c); //把大写字符转换为小写字符,本来就是小写字符的不变,返回转换后的字符
toupper(c); //把小写字符转换为大写字符,本来就是大写字符的不变,返回转换后的字符
当我们在C++里面谈论容器这个概念时,我们应该知道容器是用来存储和组织一类特定对象的集合。下面提到的标准库类型vector,就是一个容器。
类模板一般用于按照模板规定好的规则生成不同的类。我们无需很麻烦的一个一个写类的定义,只需使用模板,给出指定的少量信息,类模板就会帮助我们自动生成一个我们可以直接使用的类。vector也是一个类模板。
通过类模板创建类的过程,或者通过类型创建对象的过程,就叫做实例化。
与string的定义和初始化一样,我们也可以使用多种方式定义和初始化一个vector对象。
以下几种初始化语句被string支持:
vector<Type> v1;//创建了一个空的vector容器,这个容器是Type类型对象的集合,这个集合名字叫做为v1,执行默认初始化。
vector<Type> v2(v1);//创建了一个叫做v2的vector容器,这个容器的内容和v1相同。
vector<Type> v2=v1;//同上一句,拷贝初始化。
vector<Type> v3{a,b,c};//v3包含了初始值个数的元素。
vector <Type> v4={a,b,c};//同上。
vector <Type> v5(n,val);//直接初始化这个容器,操作后v5拥有n个元素,每个元素的值都是val。
vector <Type> v5(n);//直接初始化这个容器,操作后v5拥有n个元素,每个元素的值都被默认初始化。
当我们使用圆括号()初始化对象时,IDE会认为我们在通过语句“构建”这个对象 ;当我们使用花括号{ }初始化对象时,IDE会认为我们在初始化对象。
当我们使用等号=初始化对象时,我们就执行了“拷贝初始化”;当我们不使用=初始化对象时,我们就执行了“直接初始化”。
但是当我们在花括号里面给一个不符合对象类型的值,IDE就会认为我们正在构建而非初始化对象,一个体现就是,vector<string> s1{10}; 这个语句中,10不能转换为string,因此被系统理解为“这个string容器里有10个元素”。当然,像vector <string>s1={10};这样的语句是错误的,因为=就应该是拷贝初始化了,然而10并不能够被转化为string因此也无法赋值。
1.向容器的后面添加元素:已存在vector<T> v;,可以使用 v.push_back(vector<T> a)的方式在集合v的尾部添加元素。
2.empty和size函数成员:已存在vector<T> v;,可以使用 v.empty()的方式判断v是否为空,可以使用v.size()的方式返回v的大小。
3.重载的运算符:vector支持的运算符包括下标运算符[ ]、重载的+、==、!=、<、>、<=、>=。这一点和string类似。
当使用vector <int> 创建类时,这个类的命名空间就是vector <int>,命名空间中的迭代器类型写作vector<int>::iterator。因为这个叫做"vector<int>::iterator"的迭代器类型名太长了也不好记,这里我们使用auto推导这个类型。用成员函数cbegin和cend可以推导出底层const迭代器,就是这个迭代器对迭代器指向的内容只读不写。第6章会详细说明。
一维数组声明形式:类型名 数组名[一个常量]。比如int a[15];这里这个数组的名字是a,有15个元素,每个元素都是int型的。再比如int *a[15];这里a数组的15个元素都是int *型的,即指向int的指针,这样的指针有15个,构成了一个数组。虽然有指针数组,但是不存在元素都是引用类型的数组。
一维数组的初始化方式就是花括号初始化,形如int a[n]={1,2,3};大括号里面的内容就是初始化列表,n为数组大小,可以缺省,缺省时数组长度由初始化列表的元素个数决定。当初始化列表的值的个数比数组长度小,数组剩下的元素被初始化为默认的值,比如对于有10个元素的int型数组,如果只给出第一个元素的值,后几个元素将被初始化为0。
C++Primer第5版学习笔记(二)的更多相关文章
- C++Primer第5版学习笔记(四)
C++Primer第5版学习笔记(四) 第六章的重难点内容 你可以点击这里回顾第四/五章的内容 第六章是和函数有关的知识,函数就是命名了的代码块,可以处理不同的情况,本章内 ...
- C++Primer第5版学习笔记(三)
C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容 因为第五章的内容比较少,因此和第四章的笔记内容合并. 第四章是 ...
- C++Primer第5版学习笔记(一)
C++Primer第5版学习笔记(一) 第一.二章的重难点内容 这个笔记本主要记录了我在学习C++Primer(第5版,中文版)的过程中遇到的重难点及其分析.因为第一.二章都比较简单,因 ...
- C++Primer第五版学习笔记
<C++ Primer>Learning Note 程序实例下载地址:http://www.informit.com/title/0321714113 第一章 开始 ...
- 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性
本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...
- python cookbook第三版学习笔记二十:可自定义属性的装饰器
在开始本节之前,首先介绍下偏函数partial.首先借助help来看下partial的定义 首先来说下第一行解释的意思: partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数, ...
- C++ Primer(第4版)-学习笔记-第5部分:高级主题
第17章 用于大型程序的工具 异常处理 不存在数组或函数类型的异常.相反,如果抛出一个数组,被抛出的对象转换为指向数组首元素的指针,类似地,如果抛出一个函数,函数被转换为指向该函数的指针. 不要抛出 ...
- C++ Primer(第4版)-学习笔记-第2部分:容器和算法
第9章 顺序容器 顺序容器和关联容器 顺序容器内的元素按其位置存储和访问. 关联容器,其元素按键(key)排序. 顺序容器(sequential container). 顺序容器的元素排列次序与元素值 ...
- PMBOK(第五版)学习笔记二-十大知识领域(P87)
五大项目管理过程组:启动.规划.执行.监控.收尾过程组 十大知识领域是:项目整合管理.项目范围管理.项目时间管理.项目成本管理.项目质量管理.项目人力资源管理.项目沟通管理.项目风险管理.项目采购管理 ...
随机推荐
- This 在 C# 中的含义
这涉及到c# 中的oo思想,其实不管在c# 或其他编码语言中,很多抽象的概念当你项目经验多了,自然而然就会对这些东西理解的更透彻点,更加具象. 这里有一些面向对象编程的概念需要说明:类(Class)的 ...
- 数据库(学习整理)----5--Oracle常用的组函数
其他: 1.oracle中下标是从1开始的,Java下标是从0开始的 函数分类: 日期函数 字符函数 转换函数 数学函数 系统函数 ---在当前月份上面:增加.减少月份 select add_mont ...
- 关于java中for和foreach循环
for循环中的循环条件中的变量只求一次值!具体看最后的图片 foreach语句是java5新增,在遍历数组.集合的时候,foreach拥有不错的性能. foreach是for语句的简化,但是forea ...
- 使用java.util.Timer来周期性的执行制定的任务
使用java.util.Timer来周期性的执行制定的任务 public class HandlerTest extends Activity { int[] images = new int[] { ...
- Observer 模式
Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变.最常见的一个例子就是:对同一组数据进行 ...
- ios开发中加载的image无法显示
昨天遇到一个较奇葩的问题,imageName加载的图片显示不出来,网上查了好多资料还是没找到解决的方法: 之前图片是放在项目中SupportingFiles文件下的,怎么加载都能显示图片,于是将图片拿 ...
- Python 统计代码行
正在学习 Python, 做了个统计代码行的功能, 参考了网上很多前辈的帖子,添加了感觉还是比较实用的功能, 只是windows下测试了,而且代码文件编码形式是 utf-8的. 如果使用其它编码形式的 ...
- QFTP走了以后QNetworkAccessManager出现了
QNetworkAccessManager Class Header: #include <QNetworkAccessManager>qmake: QT += networ ...
- UltraEdit软件破解方法
一.说明 UltraEdit破解软件虽然带有“安装说明.txt”,但是我并没有弄懂--安装说明太模糊.经过一番摸索,找到了破解方法,现记录于此. 二.操作步骤 1.断开网络 2.安装软件 3.打开软件 ...
- const变量与define定义常量的区别
一.概念性区别 const 变量就是在普通变量前边加上一个关键字const,它赋值的唯一机会就是“定义时”,此变量不能被程序修改,存储在rodata区. define定义的是常量,不是变量,所以编译器 ...