大二寒假读书笔记150128

来源:互联网 发布:sql 每月销售量统计表 编辑:程序博客网 时间:2024/04/27 00:58

不要说什么北方的冷是物理攻击,南方的冷是魔法攻击了。周口这个小城还不算北方,我在室内已经冻成狗了哇,膝盖往下已经没有知觉了。

今天学习的是容器,在学校没学过,所以以基础为重

1、标准库vector类型

vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值(从0开始)。称vector为容器,个人理解vector是给这种类型的对象增加了一个维度,就像数组那样!

使用vector之前要包含相应的头文件

#include<vector>using std::vector;
vector是一个类模板。使用模板可以编写一个类定义或函数定义用于多个不同的数据类型。因此,我们可以定义保存string对象的vector,也可以自己定义一个类型去保存。幸运的是,使用类模板只需要简单了解类模板是如何定义的就可以了。

vector<int> ivec;//保存int型对象vector<Sales_item> Sales_vec;//保存Sales_vec类型的对象
上面的只是声明,<>内的是容器保存的何种类型,保存int型的vector变量名为ivec

初始化:vector有几种构造函数

vector<T> v1;//保存类型为T的对象,默认构造函数v1为空vector<T> v2(v1);//v2是v1的一个副本vector<T> v3(n,i);//包含n个值为i的元素vector<T> v4(n);//含有值初始化的元素的n个副本
关键概念:vector对象动态增长

vector对象(以及其他标准库容器)的重要属性就在于可以在运行时高效的添加元素。因为vector增长的效率高,在元素值已知的情况下,最好是动态的添加元素。这种增长方式不同于C语言中的内置数据类型,也不同于大多数其他编程语言的数据类型。具体而言,如果是C或java程序猿,由于vector元素连续存储,可能希望预先分配,实际上为了达到连续性,C++采用的刚好相反。虽然也可以预先给vector对象分配内存,但是我们一般初始化一个空vector对象,然后再动态的增加元素。

2、vector对象的操作

v.empty()    为空返回true,否则为falsev.size()    返回元素个数v.push_back(t)    在v的末尾增加一个值为t的元素,动态的增加元素v[n]    返回位置为n的元素v1 == v2    v1与v2相等返回truev1 = v2    替换v1的值为v2中元素的副本
vector中的size和empty操作类似于string中的相关操作,v.size()返回的是vector类定义的size_type的值。

vector<int>::size_type ix;//okvector::size_type is;//error,应该指出vector的元素类型


v.push_back(t)操作就是插入(push)到vector对象的“后面(back)”:


vector<string> text;string str;while(cin>>str)    text.push_back(str);
首先定义了一个空的vector对象,每循环一次都添加一个新元素到vector对象,循环结束时,text就包含了所有读入的元素。

下标操作与string的下标操作也基本类似,同样要定义一个vector<T>::size_type对象作为索引元素。

for(vector<int>::size_type ix = 0;ix != ivec.size();++ix)    ivec[ix] = 0;
此例中,即使ivec为空,for循环也会正确执行。ivec为空,则ivec.size()为0,第一次循环时,条件测试失败,一次也不执行。

3、习惯于c或java的程序猿可能会觉得难以理解,for循环为啥不用<=来作为判定条件,还有为啥不定义新变量来保存v.size()的值(我一直就这么想,,,)。C++程序猿习惯于用!=来编写循环判断条件,这在泛型编程里会讲到(先卖个关子)。

至于保存v.size()的值,这是不必须的。在C++中,像vector这种数据结构可以动态增长。像上例中的循环并未增加元素,但是如果增加新元素的话,用已经保存的长度值来作为循环判断条件会出现问题。还有,像v.size()这种小库函数,在C++里声明为内联函数,编译器直接将内联函数扩展为相应代码,调用代价比较小!

4、下标操作不能添加元素!

vector<int> ivec;for(vector<int>::size_type ix = 0;ix != 10;++ix)    ivec[ix] = ix;
这段代码是很错误的!下标只能用来获得已经存在的元素,不能用来添加新元素

for(vector<int>::size_type ix = 0;ix != 10;++ix)    ivec.push_back(ix);
这样才对。

今天冻得有点头痛,,就这么多吧。明天花点时间把迭代器跟bitset看完,又是新内容。


0 0
原创粉丝点击