大二寒假读书笔记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看完,又是新内容。
- 大二寒假读书笔记150128
- 大二寒假读书笔记150122
- 大二寒假读书笔记150124
- 大二寒假读书笔记150125
- 大二寒假读书笔记150126
- 大二寒假读书笔记150127
- 大二寒假读书笔记150129
- 大二寒假读书笔记150130
- 大二寒假读书笔记150131
- 大二寒假读书笔记150201
- 大二寒假读书笔记150203
- 大二寒假读书笔记150204
- 大二寒假读书笔记150205
- 大二寒假读书笔记150206
- 大二寒假读书笔记150207
- 大二寒假
- 大二寒假结束言
- 大二寒假计划
- 深入浅出的理解频谱泄露
- 二叉搜索树(二叉排序树)
- 使用JAXB eclipse插件根据XSD文件生成JAVA代码
- python元素移除问题
- linux ls命令
- 大二寒假读书笔记150128
- PAT Advanced Level 1007
- 啊哈C——学习3.5练习
- unity3d之计算两向量的旋转角
- Android实现推送方式解决方案
- GITHUB的使用
- C++中const的用法【03】----类
- 使用qemu-img管理虚拟机磁盘镜像(创建虚拟机,虚拟机快照)
- SpringMVC中如何读取配置文件中的值