测试结果:
1.增加元素线性表为末端插入,树是insert,耗时统计如下:
vector<deque<list<set<map
分析:list增加应该很快,但是实际上由于其内存分配策略是立即使用,则分配时间较长。new时间大于delete
2.前端删除元素 耗时如下:
list<set<map<vector<deque
分析:树用迭代器删除第一个,只有节点操作,而且有预留内存机制,所以树删除很快。list并不是快,而是deque和vector慢,由于是连续内存,在非末尾进行删除需要移动大量元素。
3.末尾删除元素,耗时如下:
vector<deque<list<set<map
分析:树根据索引值进行删除,需要先查找,再删除,效率上多了查找步骤,所以慢。
而线性表里面vector和deque都是移除空间,所以很快,而 list删除一直都是调用erase,删除效率与删除erase(begin())相等。至于为什么list删除慢,那就是list使用即时内存策略,而vector和deque使用冗余内存策略。
static std::chrono::system_clock::time_point tBegin;
void T1()
{
tBegin = std::chrono::system_clock::now();
}
int T2()
{
return (std::chrono::system_clock::now()-tBegin).count()/1000;
}
void CtestDlg::OnBnClickedOk()
{
enum TIMETYPE
{
addback,
delhead,
addhead,
delback
};
//this function test stl time
int nCount = 100000,nIndex=0,nNdi=0;
int nT[4][5] = { 0 };
//vector
vector<int> v;
T1();
for (int i = 0; i < nCount; i++)
v.push_back(i);
nT[addback][0] = T2();
T1();
while (v.size())
v.erase(v.begin());
nT[delhead][0] = T2();
v.clear();
for (int i = 0; i < nCount; i++)
v.push_back(i);
T1();
while (v.size())
v.pop_back();
nT[delback][0] = T2();
//list
list<int> l;
T1();
for (int i = 0; i < nCount; i++)
l.push_back(i);
nT[addback][1] = T2();
T1();
while (l.size())
l.erase(l.begin());
nT[delhead][1] = T2();
l.clear();
for (int i = 0; i < nCount; i++)
l.push_back(i);
T1();
while (l.size())
l.pop_back();
nT[delback][1] = T2();
//dequeue
deque<int> d;
T1();
for (int i = 0; i < nCount; i++)
d.push_back(i);
nT[addback][2] = T2();
T1();
while (d.size())
d.erase(d.begin());
nT[delhead][2] = T2();
d.clear();
for (int i = 0; i < nCount; i++)
d.push_back(i);
T1();
while (d.size())
d.pop_back();
nT[delback][2] = T2();
//set
set<int> s;
T1();
for (int i = 0; i < nCount; i++)
s.insert(i);
nT[addback][3] = T2();
T1();
while (s.size())
s.erase(s.begin());
nT[delhead][3] = T2();
s.clear();
for (int i = 0; i < nCount; i++)
s.insert(i);
T1();
while (s.size())
s.erase(s.size()-1);
nT[delback][3] = T2();
//map
map<int,int> m;
T1();
for (int i = 0; i < nCount; i++)
m.insert(std::make_pair(i,i));
nT[addback][4] = T2();
T1();
while( m.size() )
m.erase(m.begin());
nT[delhead][4] = T2(); //
m.clear();
for (int i = 0; i < nCount; i++)
m.insert(std::make_pair(i, i));
T1();
while (m.size())
m.erase(m.size()-1);
nT[delback][4] = T2();
CDialogEx::OnOK();
}