顺序容器之vector
最近因为需要,在看C++ primer,哇,感觉这本书真不错,讲的细而且到位,而且大量的练习题,不愧为C++学习的经典书籍。今天看了顺序容器方面的内容,现在汇报一下:
一、什么是vector
vector是C++标准模板库(STL)提供的一个容器,说容器可能有点抽象。简单点吧,学习C++我们都知道C++引入的一个最大的编程上的变化就是加入了面向对象的编程技术,表现在代码的编写上也就是增加了一个类,所以C++在刚提出来的时候是叫做 C WITH CLASS的。扯远了,回来吧。vector就是一个类,提供了一组依附于该类的操作函数。这样一来,我们在写代码的时候就可以调用这些函数为我们的项目服务,这样就省去了我们很多事情(STL,standard template library正是为此而设计的,关于STL,请参考http://en.wikipedia.org/wiki/Standard_Template_Library)
二、vector的使用
明白了vector是什么了,那么我们就想知道vector怎么用,下面就给大家介绍一下Vector的用法。
vector定义在STL中的vector头文件中,我们要使用vector,必须要把vector头文件括进来,即:
#include<vector>,这是第一步,然后我们就可以开始使用vector提供的各种操作了。vector提供操作如下:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
构造函数:创建一个vector对象,功能相当于C语言中定义一个变量
vector<Elem> c; //创建一个空的vector对象,就相当于定义了一个int整形变量,没给赋值
vector<Elem> c1(c2);//c2为一个vector对象,用它来创建c1,相当于int i=j;j已经定义
vector<Elem> c(n);//创建一个vector容器,容量为n,即c里面可以放n个Elem类型的元素
vector<Elem> c(n,data);//创建一个vector,容量为n,n个元素的值都为data
vector<Elem> c(c1.begin(),c1.end());//相当于c=c1,c1调用两个函数返回的是一种新的数据类型:迭代器,有关迭代器,请参考:http://baike.baidu.com/view/1413849.htm
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
############################################################################################################
常见操作:
assign(first,last):用迭代器first,last所指定的元素取代向量元素
assign(num,val):用val的num份副本取代向量元素
at(n):等价于[]运算符,返回向量中位置n的元素,因其有越界检查,故比[]索引访问安全
front():返回向量中第一个元素的引用
back():返回向量中最后一个元素的引用
begin():返回向量中第一个元素的迭代器
end():返回向量中最后一个元素的下一个迭代器(仅作结束游标,不可解引用)
max_size():返回向量类型的最大容量(2^30-1=0x3FFFFFFF)
capacity():返回向量当前开辟的空间大小(<= max_size,与向量的动态内存分配策略相关)
size():返回向量中现有元素的个数(<=capacity)
clear():删除向量中所有元素
empty():如果向量为空,返回真
erase(start,end):删除迭代器start end所指定范围内的元素
erase(i):删除迭代器i所指向的元素
erase()返回指向删除的最后一个元素的下一位置的迭代器
insert(i,x);把x插入到迭代器i所指定的位置之前
insert(i,n,x):把x的n份副本插入到迭代器i所指定的位置之前
insert(i,start,end):把迭代器start和end所指定的范围内的值插入到迭代器i所指定的位置之前
push_back(x):把x推入(插入)到向量的尾部
pop_back():弹出(删除)向量最后一个元素
rbegin():返回一个反向迭代器,该迭代器指向的元素越过了向量中的最后一个元素
rend():返回一个反向迭代器,该迭代器指向向量中第一个元素
reverse():反转元素顺序
resize(n,x):把向量的大小改为n,新元素的初值赋为x
swap(vectorref):交换2个向量的内容
#############################################################################################
操作符重载函数:
operator()//返回容器中指定位置的元素,有关操作符重载函数请参考:http://baike.baidu.com/view/1033032.htm
析构函数:
~vector()//用于销毁vector对象占用的系统资源,更详细的析构函数介绍,请参考http://baike.baidu.com/view/1277985.htm
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
三、more about vector
1、vector是一种类似于数组的数据结构,确切的说应该是动态数组。在进行内存分配的时候必须是连续的一整块空间
2、我们知道数组是有固定长度,而vector没有,这也是我们称之为动态数组的原因。那么vector是怎么实现动态数组的呢,例如申请一个vector<int> vec(10);一个
空间大小为10的vector,那么当里面存满了10个元素了怎么办呢。办法是:重新分配一块更大的空间比如20,然后把10个数据拷贝过去,释放前面申请的10个元素的
空间
3、除此之外,在操作上他的很多特性跟数组一样,如上面的介绍,大家可以一一试一下
4、在vector中做insert操作,效率很低,除了在末尾插入以外。因为vector是连续的,每次插入一个,插入位置后面的元素都要向后移动,这样效率很低。所以vector不支持push_front操作。
5、删除操作同样效率很低
6、push_back操作很方便,有可能效率很低。