我想我會用剖析器來研究這個。我的代碼:
//g++ -std=c++11 -Wall vectorvsset.cpp -g -pg -o vectorvsset
#include <time.h>
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
void GenRandom(vector<int32_t> &original)
{
original.clear();
for(size_t i=0; i<10000; i++)
original.push_back(rand());
}
void TestSet(const vector<int32_t> &original)
{
set<int32_t> testset;
testset.insert(original.begin(), original.end());
}
void TestVector(const vector<int32_t> &original)
{
vector<int32_t> testvec;
testvec.insert(testvec.end(), original.begin(), original.end());
sort(testvec.begin(), testvec.end());
}
void TestVectorConvertToSet(const vector<int32_t> &original)
{
vector<int32_t> testvec;
testvec.insert(testvec.end(), original.begin(), original.end());
sort(testvec.begin(), testvec.end());
std::set<int32_t> testsec(testvec.begin(), testvec.end());
}
int main()
{
srand(time(NULL));
cout << "RAND_MAX " << RAND_MAX << endl;
vector<int32_t> original;
for(size_t i=0; i<100; i++)
{
GenRandom(original);
TestSet(original);
TestVector(original);
TestVectorConvertToSet(original);
}
return 0;
}
使用對於g ++ gprof的(Ubuntu的5.4.0-6ubuntu1〜16.04.4)5.4.0 20160609我的(略)結果是:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
0.00 1.42 0.00 100 0.00 3.36 TestVector(std::vector<int, std::allocator<int> > const&)
0.00 1.42 0.00 100 0.00 6.86 TestVectorConvertToSet(std::vector<int, std::allocator<int> > const&)
0.00 1.42 0.00 100 0.00 3.57 TestSet(std::vector<int, std::allocator<int> > const&)
因此,它是更快地使用一個矢量,但沒有太大的區別。
在不同尺寸的元素上嘗試它們。繪製圖表。結果顯示了什麼? (爲了簡單地獲得排序結果,我期望矢量+排序更快,因爲所採用的排序可以減少簿記,這可能導致小C或掛鐘時間。) – user2864740
這取決於您閱讀的方式結果。如果你從頭到尾閱讀,設置會更快,而矢量支持隨機訪問。順便說一句,插入到集取O(logn)時間,從空集set = log1 + log2 + log3 + ... + logn = O(n)中插入1。 – tom87416
@ tom87416:爲什麼從開始到結束閱讀一個集合比從頭到尾閱讀一個矢量要快?遍歷一個集合需要在一棵樹上下一個節點指針,而遍歷一個矢量只是增加一個指針。另外,你的數學是錯誤的,蘇瑞是對的。 –