0
点赞
收藏
分享

微信扫一扫

vector list map set deque效率对比

未定义变量 2022-02-21 阅读 93

测试结果:

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();
}
举报

相关推荐

0 条评论