Vector介绍

我们再来看看另外一个常用的Java类——java.util.Vector。简单地说,一个Vector就是一个java.lang.Object实例的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但是,Vector类型的对象在创建之后,对象的大小能够根据元素的增加或者删除而扩展、缩小,请考虑下面这个向Vector加入元素的例子:
Object obj = new Object();
?Vector v = new Vector(100000);
?for(int I=0;
?I<100000; I++) { v.add(0,obj); }

除非有绝对充足的理由要求每次都把新元素插入到Vector的前面,否则上面的代码对性能不利。在默认构造函数中,Vector的初始存储能力是10个元素,如果新元素加入时存储能力不足,则以后存储能力每次加倍。Vector类就象StringBuffer类一样,每次扩展存储能力时,所有现有的元素都要复制到新的存储空间之中。下面的代码片段要比前面的例子快几个数量级:


Object obj = new Object();
Vector v = new Vector(100000);
for(int I=0; I<100000; I++) { v.add(obj); }

同样的规则也适用于Vector类的remove()方法。由于Vector中各个元素之间不能含有“空隙”,删除除最后一个元素之外的任意其他元素都导致被删除元素之后的元素向前移动。也就是说,从Vector删除最后一个元素要比删除第一个元素“开销”低好几倍。

假设要从前面的Vector删除所有元素,我们可以使用这种代码:

for(int I=0; I<100000; I++){ v.remove(0); }

但是,与下面的代码相比,前面的代码要慢几个数量级:

for(int I=0; I<100000; I++){ v.remove(v.size()-1); }

从Vector类型的对象v删除所有元素的最好方法是:

v.removeAllElements();

假设Vector类型的对象v包含字符串“Hello”。考虑下面的代码,它要从这个Vector中删除“Hello”字符串:

String s = "Hello"; int i = v.indexOf(s); if(I != -1) v.remove(s);

这些代码看起来没什么错误,但它同样对性能不利。在这段代码中,indexOf()方法对v进行顺序搜索寻找字符串“Hello”,remove(s)方法也要进行同样的顺序搜索。改进之后的版本是:

String s = "Hello"; int i = v.indexOf(s); if(I != -1) v.remove(i);

这个版本中我们直接在remove()方法中给出待删除元素的精确索引位置,从而避免了第二次搜索。一个更好的版本是:

String s = "Hello"; v.remove(s);


最后,我们再来看一个有关Vector类的代码片段:

for(int I=0; I<v.size();I++ );

如果v包含100,000个元素,这个代码片段将调用v.size()方法100,000次。虽然size方法是一个简单的方法,但它仍旧需要一次方法调用的开销,至少JVM需要为它配置以及清除堆栈环境。在这里,for循环内部的代码不会以任何方式修改Vector类型对象v的大小,因此上面的代码最好改写成下面这种形式:

int size = v.size(); for(int I=0; I<size ; I++ );

虽然这是一个简单的改动,但它仍旧赢得了性能。毕竟,每一个CPU周期都是宝贵的。

拙劣的代码编写方式导致代码性能下降。但是,正如本文例子所显示的,我们只要采取一些简单的措施就能够显著地改善代码性能。


Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大。在删除一些元素之后,数组变小,增长长度是原来的一倍。他支持进程同步.

  Vector 有三个构造函数:

  public Vector(int initialCapacity,int capacityIncrement)
  public Vector(int initialCapacity)
  public Vector()

  Vector 运行时创建一个初始的存储容量initialCapacity,存储容量是以capacityIncrement 变量定义的增量增长。初始的存储容量和capacityIncrement 可以在Vector 的构造函数中定义。第二个构造函数只创建初始存储容量。第三个构造函数既不指定初始的存储容量也不指定capacityIncrement。

  Vector 类提供的访问方法支持类似数组运算和与Vector 大小相关的运算。类似数组的运算允许向量中增加,删除和插入元素。它们也允许测试矢量的内容和检索指定的元素,与大小相关的运算允许判定字节大小和矢量中元素不数目。

  现针对经常用到的对向量增,删,插功能举例描述:

   addElement(Object obj)  

   把组件加到向量尾部,同时大小加1,向量容量比以前大1  

   insertElementAt(Object obj, int index)   

   把组件加到所定索引处,此后的内容向后移动1 个单位 

   setElementAt(Object obj, int index) 

   把组件加到所定索引处,此处的内容被代替。

   removeElement(Object obj) 把向量中含有本组件内容移走。

   removeAllElements() 把向量中所有组件移走,向量大小为0。

 

比较了一下数组和vector的[]操作的效率。相差还是很多的.

vector<int> a(100);
int b[100];

      struct timeval ss, se, us, ue;
              gettimeofday(&ss, NULL);
              vector<int>::iterator it;
                for (int i=0; i<1000000; i++) {
                    for (int j=0;j<100; j++) {//it=a.begin(); it<a.end(); it++) {
                        a[j] = 1;
                    }
                }
                gettimeofday(&se, NULL);
         
                gettimeofday(&us, NULL);
                for (int i=0; i<1000000; i++) {
                    for (int j=0; j<100; j++) {
                        b[j] = 1;
                    }
                }
                gettimeofday(&ue, NULL);


vector operation: 6067.690000 ms, 606.769000 us per req
array operation: 468.589000 ms, 46.858900 us per req

相差10几倍。在一个内部循环中(如果超过亿数量级),用vector和数组差别还是很大的。
对于一个100个元素的数组,做循环,vector大概要用到10m/亿次, 数组用到45s/亿次 左右。


参考资料:http://hi.baidu.com/kittig/item/3e439c8f80ff6a874514cf68

    http://blog.csdn.net/carefreefly/article/details/1608913

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的vector是一个动态数组,可以根据需要随时调整大小。它是标准库中最常用的容器之一,提供了许多方便的成员函数和操作符重载。 使用vector容器需要包含头文件`<vector>`。 下面是一些vector容器的特点和常用操作: 1. 动态大小:vector可以根据需要动态调整大小,可以在任意位置插入或删除元素。 2. 快速随机访问:vector支持通过索引快速访问元素,时间复杂度为O(1)。 3. 连续存储:vector的元素在内存中是连续存储的,这样可以提高访问效率。 4. 自动内存管理:vector会自动管理内部的动态内存分配和释放,无需手动管理。 5. 范围检查:vector会在访问操作时进行边界检查,确保不越界。 以下是一些常用的vector操作: - `push_back(value)`:在vector末尾添加一个元素。 - `pop_back()`:删除vector末尾的元素。 - `size()`:返回vector中元素的个数。 - `empty()`:判断vector是否为空。 - `clear()`:清空vector中的所有元素。 - `at(index)`:返回指定索引位置的元素,并进行范围检查。 - `front()`:返回第一个元素。 - `back()`:返回最后一个元素。 - `insert(iterator, value)`:在指定位置插入一个元素。 - `erase(iterator)`:删除指定位置的元素。 - `begin()`和`end()`:返回指向vector第一个元素和最后一个元素之后的迭代器,用于循环遍历。 vector容器提供了丰富的功能,并且易于使用,适合在需要动态大小和快速访问的情况下使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值