vector list map set deque效率对比

测试结果:

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值