(写于December 9th, 2012)
自从踏上数据挖掘之路,不知不觉就重拾搁置了半年的c++,发现我不只是学弱,简直就是c++白痴级别了…读人家决策树的代码,各种陌生知识,vector 是神马?好吧,从柜子里搜出来放了近一年却依旧如新的《C++Primer》(PS:亚马逊的订单竟然还在里边夹着…)。
vector:c++中内容丰富的抽象数据类型标准库,定义了大小可变的集合,往往将迭代器用做配套类型(companion type)用于访问vector中的元素。
标准库vector类型:
vector是一种类型的对象的集合,每个对象都有一个对应的整数索引值。与string对象一样,标准库将负责管理与存储元素相关的内存。也称为容器,是因为他可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。
使用vector之前必须包含相应的头文件:
#include<vector>
vector是一个类模板。因此可以用于多个不同的数据类型。(string,int,自定义的类)。eg:
vector<int>ivec;该类型为含有若干int类型对象的vector,变量名为ivec。
vector<Sales_item>Sales_vec;变量名为Sales_vec,保存的元素是Sales_item类型的对象。
(vector<int>与vector<string>都是数据类型)
vector对象的定义与初始化:
vector<T>v1;保存的类型为T的对象。默认构造函数,v1为空
vector<T>v2(v1) ;v2是v1的一个副本
vector<T>v3(n,i);v3包含n个值为i的元素
vector<T>v4(n);v4含有值初始化的元素的n个副本
vector对象(以及其他标准库容器对象)的重要属性就在于可以在运行时高效的添加元素。因为vector增长的效率高,当元素值已知时,最好是通过动态的向它添加元素来让他增长。
值初始化:
如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化。这个由库生成的初始值将用来初始化容器中的每个元素,具体值为何,取决于存储在vector中元素的数据类型。
-
如果vector保存内置类型(int)的元素,则标准库将用0值创建元素初始化式。
-
如果vector保存的是含有构造函数的类类型(string)的元素,标准库将用该类型的默认构造函数创建元素初始化式。
-
如果元素类型可能是没有定义任何构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。
vector 对象的操作:
v.empty() 如果v为空,则返回false
v.size() 返回v中元素的个数
v.push_back(t) 在v的末尾增加一个值为t的元素
v[n] 返回v中位置为n的元素(必须是已存在的元素才能用下标操作符进行索引。不能用来添加元素)
v1=v2 把v1的元素替换为v2中元素的副本
v1==v2 如果v1与v2相等,则返回true
!=,<,<=,>,>= 保持这些操作符惯有的含义
迭代器:
除了使用下标来访问vector对象的元素外,标准库还为每一种标准容器定义了一种迭代器类型。迭代器是一种检查容器内元素并遍历元素的数据类型。
1.容器的iterator类型
例如:
vector<int>::iterator iter;
定义了一个名为iter的变量,他的数据类型是由vector<int>定义的iterator(与迭代器是几类型的含义相同,即这种类型支持迭代器的各种操作)类型。
2.begin与end操作
每种容器都定义了begin与end函数,用于返回迭代器,如果容器中有元素的话,由begin返回的迭代器指向第一个元素:
vector<int>::iteratoriter=ivec.begin();
若vector不为空则初始化后,iter即指该元素为ivec[0]。
由end操作返回的迭代器指向vector的“末端元素的下一个”,即超出末端迭代器(表示一个不存在的元素)。它所返回的迭代器并不指向vector中的任何实际元素,而是起一个哨兵的作用,表示已经处理完vector中的元素。若vector为空,begin与end返回的迭代器相同。
3.vector迭代器的自增和解引用运算
迭代器类型可使用解引用操作符(*操作符)来访问迭代器所指向的元素:*iter=0;(即指向vector对象的一个元素赋值为0)
使用++iter可实现自增。
(由于end操作返回的迭代器不指向任何元素,因此不能对它进行解引或自增操作)
4.迭代器的其他操作
用==或!=操作符来比较两个迭代器,如果两个迭代器对象指向同一个元素,则他们相等,否则就不相等。
5.const_iterator:
每种容器类型还定义了const_iterator的类型,只能用来读取容器内元素,但不能改变其值。它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器进行自增以及使用解引用操作符来读取值。
迭代器的算数操作
1.可以对迭代器对象加上或减去一个整型值。将产生一个新的迭代器,其位置在iter所指向元素之前或之后的某个位置。加减之后的结果必须指向iter所指vector中的某个元素,或者是vector末端的后一个元素。加上或减去值得类型应该是vector的size_type或difference_type(signed类型的值)类型。
2.可以用迭代器算数操作来移动迭代器直接指向某个元素。
(任何改变vector长度的操作都会使已存在的迭代器失效。)