顺序容器之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操作很方便,有可能效率很低。

原文地址:https://www.cnblogs.com/wangyichao/p/3347643.html