C++ primer读书笔记(三)

前言

不知不觉都要国庆节了,这也是我的看C++primer的第三天。在这里立一个flag在12月底之前啃完这本800多页的厚书。今天看的这一章内容都比较简单,主要就是一些比较常见的知识点,所以看得也比较快。接下来我将把我的笔记分为四个部分:string,vector,迭代器,数组。
但是在这之前还有一个小小的知识点就是头文件中不应该包含命名空间的using说明。

string

在C++中存在一些标准库,这些是语言开发人员为程序开发者预先编写好的一些库函数。就像为什么Python适合做数据挖掘就是因为里面含有很多已经编写好的库函数,其实Python能够实现的逻辑,用C++同样也能够实现。首先来看区别于C语言的string——表示可变长的字符序列,string定义在命名空间std中。首先使用string标准库需要引入头文件

#include <string>

常见的string初始化方式,当然也可以选择不初始化。

string s1;
string s2(s1);
string s2 = s1;//和上一条语句完全相同
string s3("hello");
string s3 = "hello";//和上一条语句完全相同
string s4(n,'c');//初始化为n个连续字符c组成的串

关于string的一些操作

is >> s;os << s;//其中is和os分别是输入输出流,和其它类型的数据输入输出一样处理
getline(is,s);

为什么要把这两个单独拿出来,因为在cin操作中遇到空格就会结束。比如我要输入一个welcome to Chongqing!如果使用cin那么就是出现只读取到welcome然后遇到空格结束。但是如果我要读取一整行,就需要使用getline函数。
其余的操作都是很符合逻辑了,在比较大小的时候,优先比较对应字符的字典序,后比较字符串长度。在这里面有一个size::type,虽然很复杂但是不影响我们正常使用,不必过多关心。
还有一个需要关心一点就是允许字面值和string对象相加,例如

string s1 = "hello";
string s2 = s1 + "world";//得到的s2就是helloworld

但是不允许两个字面值相加,例如"hello"+"world";这句话在C++中是非法的。
另外引入的一个范围for语句

for(char temp:s){
	cout << temp;
}

通过上面这个语句就可以遍历整个字符串,而不用只用普通的for循环可能会导致越界访问。后面也会经常使用这个语句。至于迭代器我放在后面有专门的一部分来讲解。

vector

首先需要引入一个容器的概念,我的理解就是容器就是一个大桶,他可以装很多种类型的对象。但是我们在装东西的时候必须在桶盖子上面标记好这个桶里面装的什么东西,比如这个桶里是10块钱的白酒,那个桶里是50块钱的白酒。必须要让外面的人知道里面装的东西。容器也是一样我们需要在定义的时候指定这个容器实例化成什么样的类。

vector<char> v1;//这是一个char的容器
vector<string> v2;

初始化的方式基本上和string类似,所以就不再赘述,也没有什么难度。但是由于vector拥有自增性,我们通常直接定义一个空vector,当系统运行是获取元素再加入其中初始化有一个特例就是,如果花括号里面值不能用于元素初始化,则认为是构造vector对象。

vector<string> v1{10,"hi"};

对于上面这个句子,如果按照正常花括号的使用方式他就应该认为是10和"hi"初始化v1。但是v1是一个string的容器不能初始化为10。这个时候编译器就认为是v1(10,"hi");他们两个完全一致。
vector的其它操作都是很简单,不再赘述。vector最后我要强调的内容就是 vector对象如果使用下标运算符进行操作,则仅能用于访问不能用于添加元素。

迭代器

首先我们要强调一下迭代器的优点:所有标准库容器都可以使用迭代器,只有少数几个才同时支持下标运算符。言外之意就是尽量都用迭代器。
废话不多说,直接看他的定义

auto b = v.begin(),e = v.end();

下面我们来解释一下这两个句子。第一个b指向的是容器的第一个元素,而e指向的是容器最后元素的下一个位置,也被称为尾后迭代器。
关于迭代器的运算符,只强调一个==和!=,当两个迭代器指向的元素相同或者都是同个容器的尾后迭代器则他们相等,否则两个迭代器不相等。其他的和C语言学过的指针操作也差不过的。
需要注意的是尾后迭代器不能进行++和–的操作。
我们写一个迭代器的应用:

for(auto it = s.begin();it != s.end();it++)
	cout >> *it;

在这里面我们实现了遍历整个vector,需要强调的就是所有标准库容器都支持== 和!=,但是大部分没有定义<。所以在我们的平常使用过程中尽量使用 == 和!=。
在C++11中引入了两个新的函数,分别是cbegin和cend,他的作用就是返回一个常量,主要用于仅读取不写入的情况下。

数组

对于数组和vector首先我们对其进行一个对比。
vector:比较灵活,可扩容,但是性能差。相应的数组缺点就是vector的优点,优点就是vector的缺点。
唯一需要强调的就是不允许数组拷贝和赋值。这是和vector不同的地方。数组绝大多数内容都还是和C语言中完全相同,所以我就不再赘述了。

总结

回顾这些知识点要么在Java中出现过要么在C语言中有所学习,慢慢就会发现其实学习一门新的语言就是学习其中和其它语言不同的库函数以及一些完全不同的符号表示。其他的逻辑什么的都是完全相同的。我估计我国庆节前能看完第四章吧。加油!

发布了7 篇原创文章 · 获赞 5 · 访问量 984

猜你喜欢

转载自blog.csdn.net/deng821776892/article/details/101475005
今日推荐