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)
五大项目管理过程组:启动.规划.执行.监控.收尾过程组 十大知识领域是:项目整合管理.项目范围管理.项目时间管理.项目成本管理.项目质量管理.项目人力资源管理.项目沟通管理.项目风险管理.项目采购管理 ...
随机推荐
- 停止Java线程,小心interrupt()方法
来源:http://blog.csdn.net/wxwzy738/article/details/8516253 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决 ...
- JavaScript中Ajax的get和post请求
AJAX = 异步 JavaScript和XML(Asynchronous JavaScript and XML) 作用:在不重新加载整个网页的情况下,对网页的某部分进行更新. 两种请求方式: 1 ...
- 《转》15种CSS混合模式让图片产生令人惊艳的效果
浏览器支持 按照现在情况来讲, 浏览器支持 CSSbackground-blend-mode属性还在不断的完善中.早期版本的浏览器目前还不支持,但caniuse.com报告说在Chrome,Firef ...
- LATEX学习笔记1
LATEX源文件的结构分三大部分,依次为:文档类声明.序言(可选).正文. 文档结构 \documentclass{article} \usepackage{amsmath} \usepackage{ ...
- 校省选赛第一场C题解Practice
比赛时间只有两个小时,我没有选做这题,因为当时看样例也看不懂,比较烦恼. 后来发现,该题对输入输出要求很低.远远没有昨天我在做的A题的麻烦,赛后认真看了一下就明白了,写了一下,一次就AC了,没问题,真 ...
- YouTube视频代码总结
var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api" ...
- 开发错误日志之No matching bean of type [xxx] found for dependency
No matching bean of type [org.springframework.data.mongodb.core.MongoTemplate] found for dependency ...
- 开启 htaccess 配置
是在wamp中,apache2.2 开启 伪静态时,httpd.conf 配置如下: 查找 <Directory />Options FollowSymLinksAllowOverride ...
- sharepoint读取站点下列表
前言 还是自己做着练习,也算对这个代码的一个认识吧.东西没什么. 过程 这是后台的一下代码,其中我会对标注的地方解释一下. 标注1:是获取的列表中的某一个列名,标注2:是这个列表下的数据列的名称,我们 ...
- Curl 采集乱码 gzip 原因及解决方案 utf-8
用curl获取一个经过gzip压缩后的网页时返回乱码 原因大体就是服务器返回的Content-Encoding的值和网页的编码不同,造成curl解码出问题,直接将gzip或deflate编码的文件下载 ...