|
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好在哪。这也算是一个小小的抗议吧……
|
|