浅析顺序容器

顺序容器,指的是将一组具有相同类型T的对象,以严格的线性形式组织在一起。顺序由容器可以视为数组和链表的推广。包括三种顺序容器:vector<T>,deque<T>和list<T>。

vector是一种顺序容器,存放的元素是以连续的数组的方式存储的,也就是说可以通过v[i]的方式访问vector中的元素,此时vector的访问时间是非常小的。而在对特定的值进行访问时,只能通过遍历vector的方式进行比较,这样的操作会导致较大的时间开销。同时在对vector的中间插入元素或删除元素时,由于需要保持元素的连续性,通常会导致vector把后面的元素复制一遍甚至与重新分配的数组。因此,在随机插入方面vector相对来说性能较低。

注意:vector多用于不需要对数据进行随机增,删的场合。

//如果要在程序中使用vector,必须包含下面的头文件:
#include<vector>

//如果要在程序中使用vector,必须包含下面的头文件;
#include<vector>

//vector属于std命名域的,因此需要通过命名限定,代码如下:
using std::vector;
vector<int>vInts;

//或者是连在一起,使用全名,代码如下:
std::vector<int>vInts;

//还可以像<iostream>中的cout一样使用全局的命名域方式:
using namespace std;

//有多种方法可以创建vector容器,以下介绍几种常用的。
//创建一个Widget类型的空的vector对象:
vector<Widget>vWidgets;					//空的vector对象

//创建一个包含500个Widget类型数据的vector:
vector<Widget>vWidgets(500);			//包含500个对象的vector

//创建一个包含500个Widget类型数据的vector,并且都初始化为0;
vector<Widget>vWidgets(500,Widget(0));	//包含500个对象的vector,并初始化为0

//利用现有的vector创建一个拷贝:
vector<Widget>vWidgetsFromAnother(vWidgets);  //利用现有的vector创建一个拷贝

vector是一种容器,那么可以向vector添加一个数据,vector添加数据的默认方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需求来分配内存。例如,在vector<Widget>中添加10个数据,需要编写如下代码:

for (int i = 0; i < 10; i++)
	v.push_back(Widget[i]);
很多时候不必要知道vector里面有多少数据,因为vector中的数据是动态分配的,使用push_back()将导致vector的数据增加。如果想知道vector是否存放两种数据,可以使用empty()函数。要过去vector的大小,可以使用size()。如果想获取一个vector v 的大小,但不知道它是否为空,或者已经包含了数据。如果空想设置为0,可以使用下面的代码实现:

int nSize = v.empty() ? -1 : static_cast<int>(v.size());

访问vector中的数据有如下两种方法。

a.vector::at();

b.vector::operator[];

operator[]主要是为了与C语言进行兼容。使用该操作可以向C语言数组一样操作,但at()是首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个异常,而operator[]却不会。因此operator[]容易造成一些错误,一般不使用它,如下代码所示:

	vector<int>v;
	v.reserve(10);
	for (int i = 0; i < 7; i++)
		v.push_back(i);
	try
	{
		int iVal1 = v[7];
		int iVal2 = v.at(7);
	}
	catch (const exception &e)
	{
		cout << e.what();
	}

vector能够非常容易的添加数据,也能很方便的取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据。当删除数据的时候,需要知道要删除尾部的数据,或者是删除所有数据,还是个别数据。

deque容器是一个双端队列,存放的数据不是以连续的形式存放的。其操作接口和vector类似。
list容器:一种链表的实现,储存的元素是通过双向链表实现的。双向链表中的每一个结点存储一个元素。其优势在于list的任意位置进行插入和删除时,非常的快速。但因此也有一个问题是,对于list中的内容只能通过连续的方式对元素进行存取。例如需要对list中的第1000个元素进行访问,并修改其中的数据,那么只能从list开头开始一个一个的移动,知道到达第1000个元素为止。因此list在查找和随机存取时需要耗费更大的开销。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值