vector常用方法

1.Vector的能力

Vector模塑出一个动态数组。因此,它本身是“将元素置于动态数组中加以管理”的一个抽象概念。

在末端附加或删除元素时,vector的性能相当好。可是如果你在前面或者中部安插或元素元素,性能就不怎么样了,因为操作点之后的每一个元素都必须移动另一个位置,而每一次移动都得调用assignment(赋值)操作符。

在内存分配方面,可以使用reserve(),保留适当容量,避免一再重新配置内存。另一种方法是,初始化期间就向构造函数传递附加参数,构造出足够的空间。如果你的参数是个数值,它将成为vector的起始大小:std::vector<T> v(5);,当然,要获得这种能力,此种元素型别必须提供一个default构造函数。请注意,如果型别很复杂,就算提供了default构造函数,初始化操作也很耗时。如果你这么做只不过是为了保留足够的内存,那倒不如用reserve()。

2.Vector的操作函数

几个重要的函数:

c.size():返回当前的元素数量。

c.empty():判断大小是否为零。等同于size()==0,但可能更快。

c.max_size():返回可容纳的元素最大数量。

capacity():返回重新分配空间前所能容纳的元素最大数量。

另外需要注意的是:

c1.swap(c2)与swap(c1,c2)虽然都是交换元素,但swap(c1,c2)是一个全局函数。

用来存取元素的函数:c.at(idx),c.[idx],c.front(),c.back()。这其中,只有c.at()会进行范围检查。

所以,在调用operator[]时,必须心理有数,确定索引有效;调用front(),或back()时,必须确定容器不空。

例如:

Std::vector<Elem>coll;

If(coll.size()>5)

    Coll[5]=elem;

If(!coll.empty())

    Cout<<coll.front();

迭代器相关函数

Vector提供了一些常规函数来获取迭代器。Begin,end,rbegin,rend这四个函数都是返回迭代器的。

这些迭代器的确切型别由实作版本决定。对vector来说,通常就是一个指针。一般指针就是随机存取迭代器,而vector内部结构通常也是个数组,所以指针行为可以适用。不过我们不可能仰仗这一点。

Vector迭代器持续有效,除非发生两种情况:1,使用者在一个较小索引位置上安插或移除元素;2,由于容量变化而引起内存重新分配。

 

安插和移除元素:

依照STL的惯例,你必须保证传入的参数合法:

1,          迭代器必须指向一个合法位置

2,          区间的起始位置不能在结束位置之后

3,          决不能从空容器中移除元素

将vectors当作一般arrays使用:

简单地说,任何地点只要你需要一个动态数组,你就可以使用vector。(此处应该说明了vector的主要用途)例如,你可以利用vector来存放常规的C字符串(型别为char*或const char*):

std::vector<char>v;

v.resize(41);

strcpy(&v[0], ”hello,world!”);

printf(“%s/n”,&[0]);

不过,这么运用vector你可得小心(和使用动态数组一样小心),例如你必须确保上述vector的大小足以容纳所有数据,如果你用的是C-String,记住最后有个’/0’元素。这个例子说明,不管出于什么原因(例如为了和既有C程序库打交道),只要你需要一个元素型别为T的数组,就可以采用vector<T>,然后传递第一元素的地址给它。

注意,千万不要把迭代器当作第一个元素的地址传递。Vector迭代器是由实作版本定义的,也许并不是个一般指针。

异常处理:

Vector只支持最低限度的逻辑错误检查。下标操作符的安全版本at(),是唯一被标准规格书要求可能抛出异常的一个函数。

最后提一句吧,bool版本的vector是特殊的,根据实作版本不同而有所不同。但确定是使用位操作的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值