(sequence container) vector and list

   顺序容器是拥有单一元素组成的一个有序集合。两个主要的sequence container 是 vector 和 list. 

   vector与list 的异同有点类似与 顺序表和双向链表的对比

   vector 表示的是一段连续的内存区域, 每个元素被顺序的存储在这都内存中。因此对于容器中元素的随机访问效率很高。但是对于随机的插入和删除元素效率很低,如果需要在非两端插入元素,则需要将待插入元素的右边的所有元素都拷贝一遍。

   list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向连接起来,从而允许向前与向后遍历。在list中插入和删除某个元素效率很高,只需要将指针重新赋值,不必拷贝大量元素的值来实现移动。但是,随机的访问元素需要遍历。

   在选择顺序容器时,根据数据是否要进行相应操作而做出判断。如果要随机访问一个容器的元素,则vector比list 要好得多。 如果要对数据频繁的进行更新则list更能胜任。如果我们既需要随机访问元素又需要随机插入和删除元素,需要在随机访问的代价和拷贝右边或左边相邻元素的代价之间进行折衷。

   这两个容器的容量都是动态增长的,所有不需要考虑存储元素的个数。但vector 和list 的增长方式是不同的。list在新增元素只需包含元素所需的存储区,额外增加2个附加指针。 而vector的增长方式与额外开销更加复杂。

   下面通过一个简单程序了解一下vector容量的增长和 容器容量与大小的区别。

/* ***********************************************************
 * 容器的容量和容器的大小概念的区别
 * modified by quanspace 2013-01-19 15:01
 */

# include <iostream>
# include <vector>
using namespace std;

int main()
{
	vector< int > int_vec;
	cout<<"int_vec: size: "<<int_vec.size()
		<<" capacity: "<<int_vec.capacity()<<endl;

	for(int i = 0; i<18; i++){
		int_vec.push_back(i);
		cout<<"int_vec: size: "<<int_vec.size()
			<<" capacity: "<<int_vec.capacity()<<endl;
	}
	return 0;
}	

/*
result:
---------------------------------------------------
int_vec: size: 0 capacity: 0
int_vec: size: 1 capacity: 1
int_vec: size: 2 capacity: 2
int_vec: size: 3 capacity: 4
int_vec: size: 4 capacity: 4
int_vec: size: 5 capacity: 8
int_vec: size: 6 capacity: 8
int_vec: size: 7 capacity: 8
int_vec: size: 8 capacity: 8
int_vec: size: 9 capacity: 16
int_vec: size: 10 capacity: 16
int_vec: size: 11 capacity: 16
int_vec: size: 12 capacity: 16
int_vec: size: 13 capacity: 16
int_vec: size: 14 capacity: 16
int_vec: size: 15 capacity: 16
int_vec: size: 16 capacity: 16
int_vec: size: 17 capacity: 32
int_vec: size: 18 capacity: 32
Press any key to continue
*/
    为了提高效率实际上vector 并不是随每一个元素的插入而增长自己,而是当vector 需要增长自身时它实际分配的空间比当前所需的空间要多一些。也就是说它分配了一些额外的内存容量或者说它预留了这些存储区分配的额外容量的。确切数目由具体实现定义,这个策略使容器的增长效率更高,因此实际上对于小的对象vector 在实践中比list效率更高。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值