|
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好在哪。這也算是一個小小的抗議吧……
|
|