之因此专门把STL中的这两个拿出来讲一说,是由于vector和deque都是支持随机访问的,其支持的迭代器类型都为随机访问,而不像map,set,list等都是支持双向迭代器的。程序员
vector,deuqe之对比:
算法
1:随机访问速度:vector > deque。架构
2;deque性能损失比vector高几个数量级:由于deque首次插入一个元素时,会默认动态分配512字节空间,当这512字节空间用完后,它会再动态分配本身另外的512字节空间,而后虚拟地连在一块儿。deque的这种设计使得它具备比vector复杂得多的架构、算法和迭代器设计,也使得性能损失比vector高!性能
3:在插入删除操做时,deque因为vector:对于vector而言,因为其是一端开口,因此在尾部插入耗费固定的时间,而在头部进行插入时,耗费的时间与vector的大小成正比,vector越大,耗费的时间越多。而对于deque,无论插入删除操做是在头部仍是尾部进行,算法的效率是固定的。spa
只看不写的程序员不是优秀的程序员,下面咱们用代码来讲明上述问题:设计
先看vector的:code
int main() { struct timeb tb1,tb2; //定义时间,以便计算程序先后的执行时间 unsigned int real_time = 0; ifstream ifs("test1.txt"); //我在test1.txt里存放了一百万个数 ofstream ofs("test2.txt"); //将整理后的数据存放到test2.txt里 istream_iterator<int> ibeg(ifs); istream_iterator<int> iend; //无参数默认为end ostream_iterator<int> iwrt(ofs," "); vector<int> vec(ibeg, iend); //定义vector ftime(&tb1); sort(vec.begin(),vec.end()); //对一百万个数据进行排序 copy(vec.begin(),vec.end(),iwrt); //写入到目标文件内 ftime(&tb2); real_time = tb2.millitm - tb1.millitm + (tb2.time - tb1.time)*1000;//获得完成排序和写入操做的执行时间 cout<<"vector time is "<<real_time<<"ms"<<endl; return 0; }
执行后输出结果为:vector time is 1646ms。排序
咱们再来看看deque的代码:get
int main() { struct timeb qtb1,qtb2; unsigned qreal_time = 0; ifstream ifs("test1.txt"); ofstream ofs("test3.txt"); //将处理后的数据写入到test3.txt内 istream_iterator<int> qbeg(ifs); istream_iterator<int> qend; ostream_iterator<int> qwrt(ofs," "); deque<int> deq(qbeg,qend); ftime(&qtb1); sort(deq.begin(),deq.end()); copy(deq.begin(),deq.end(),qwrt); ftime(&qtb2); qreal_time = qtb2.millitm - qtb1.millitm + (qtb2.time - qtb1.time)*1000; cout<<"deque time is "<<qreal_time<<"ms"<<endl; return 0; }
执行后输出结果为:deque time is 4396ms;qt
能够看出,在顺序访问上,vector的速度是优于deque的。
咱们再来看看插入的时候,一样先看vector的插入:
int main() { struct timeval tb1,tb2,tb3; unsigned int real_time = 0; ifstream ifs("test2.txt"); //在test2.txt的一百万个数据间操做 istream_iterator<int> ibeg(ifs); istream_iterator<int> iend; vector<int> vec(ibeg, iend); gettimeofday(&tb1,NULL); vec.insert(vec.begin(),1); //在开头位置插入 gettimeofday(&tb2,NULL); real_time = tb2.tv_usec - tb1.tv_usec + (tb2.tv_sec - tb1.tv_sec)*1000; //获取开头位置插入所耗时间 cout<<"vector head time is "<<real_time<<"us"<<endl; vec.insert(vec.end(),1); //在末尾位置插入 gettimeofday(&tb3,NULL); real_time = tb3.tv_usec - tb2.tv_usec + (tb3.tv_sec - tb2.tv_sec)*1000; //在末尾位置插入所耗时间 cout<<"veator end time is "<<real_time<<"us"<<endl; return 0; }
执行以后,打印结果为:vector head time is 780 us
vector end time is 87us
咱们再来看看 deque的:
int main() { struct timeval qtb1,qtb2,qtb3; unsigned qreal_time = 0; ifstream ifs("test3.txt"); istream_iterator<int> qbeg(ifs); istream_iterator<int> qend; deque<int> deq(qbeg,qend); gettimeofday(&qtb1,NULL); deq.insert(deq.begin(),1); //在开头插入 gettimeofday(&qtb2,NULL); qreal_time = qtb2.tv_usec - qtb1.tv_usec + (qtb2.tv_sec - qtb1.tv_sec)*1000000; cout<<"deque head time is "<<qreal_time<<"us"<<endl; deq.insert(deq.end(),1); //在末尾插入 gettimeofday(&qtb3,NULL); qreal_time = qtb3.tv_usec - qtb2.tv_usec + (qtb3.tv_sec - qtb2.tv_sec)*1000000; cout<<"deque end time is "<<qreal_time<<"us"<<endl; return 0; }
执行以后,打印结果为:deque head time is 1us
deque end time is 62us
能够获得,在vector和deque进行插入删除时,deque的效率是高于vector的。当都是在末尾进行插入时,vector和deque的差异不大,可是在对头部进行插入时,差距十分明显。
上面的几条差很少也就论述完了。
总结一下:当进行插入删除时候,选择deque,当进行顺序访问时,选择vector;