标题: stl::vector使用心得 [打印本页]

作者: heicc    时间: 2015-1-5 14:31
标题: stl::vector使用心得
1、同类型vector之间拷贝数据使用push_back还是insert
此问题貌似很搞笑,但请看完示例:
const   int   Num   =   5000000;
DWORD   s, d;
vector <int>   v, w( 5000000, 0 );
v.reserve(5000001);
现在将w中的数据全部拷贝到v中,即以下两种情况对比:
s   =   GetTickCount();
for ( int i = 0; i < Num; ++ i )
{
        v.push_back( v[ i ] );
}
d   =   GetTickCount();

s   =   GetTickCount();
v.insert( v.end(), w.begin(), w.end() );
d   =   GetTickCount();
可以自己试试看看d-s的值,请多试几次做做统计,归纳得出insert能省一半左右的时间……
心得:vector之间拷贝数据时批量操作很省时间,但若数据量很少,其实也无所谓,当数据量在10W以下,本身就花不了多少时间。
2、要首尾操作用vector还是deque
这个问题貌似还要搞笑,请继续看完示例:
const   int   Num   =   10000;
int  aaaaaaaa;
DWORD   s, d;
vector <int>   v,
v.reserve(5000001);
deque <int>     q;
现在比较下面两段程序的运行时间:
s   =   GetTickCount();
for   (int   i   =   0;   i   <   6000;   i++)
{
            for   (int   j   =   0;   j  <   Num;   j++)
            {
                    v.push_back(j);
            }
            for   (int  j   =   0;   j   <   Num;   j++)
            {
                    aaaaaaaa = v[j];
            }
            v.erase(v.begin(), v.end() - Num/2);
}
d   =   GetTickCount();

s   =   GetTickCount();
for   (int   i   =   0;   i   <   6000;   i++)
{
            for   (int   j   =   0;   j  <   Num;   j++)
            {
                    q.push_back(j);
            }
            for   (int  j   =   0;   j   <   Num;   j++)
            {
                    aaaaaaaa = q[j];
            }
            q.erase(q.begin(), q.end() - Num/2);
}
d   =   GetTickCount();
对比试验结果,让宣称需要首尾操作首选的deque情何以堪,需要花费vector十倍左右的时间。
有经验的同志们仔细看看就能明白我这里模拟的是什么,对,就是数据采集、读取、删除的不间断操作。当然v.reserve(5000001);语句功不可没啊!vector连续存储,删除起来自然快。
心得:批量处理,我热爱vctor!!!若需要每采集一个数据读取删除一个,那么还是deque占优势的,我这里回避了deque单个处理时的pop_front()函数。
实际使用什么,自然要根据实际情况加以判断,我写这些就是想发泄一下!以前一个老工程师总和我说deque好deque快,首尾操作用deque……可在我们公司的使用现状下,我不觉得deque好在哪。这也算是一个小小的抗议吧……






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1