STL库中list前端删除居然比vector慢

list按理说在插入和删除方面应该比vector快的多才是,对于百万量级以上list确实比vector快的多。可是对于容器大小都为10万的vector和list,从前端依... list按理说在插入和删除方面应该比vector快的多才是,对于百万量级以上list确实比vector快的多。可是对于容器大小都为10万的vector和list,从前端依次删除vector所有元素要3s左右,而list却需要8s多,这到底是什么原因?求大牛指导。运行环境是VS2010。 展开
 我来答
zhangqingxian
2013-08-24 · TA获得超过268个赞
知道小有建树答主
回答量:362
采纳率:0%
帮助的人:304万
展开全部
还真挺有意思的,我刚才试了下,确实这样。
用vector<int>和list<int>测试,确实vector的erase更快。我看好像vector的erase是通过memmove来实现的,可能是memmove的效率很好,所以才会这样。
不过把int换成一个对象(不是对象指针),就不一样了,你可以试试看:
class Data
{
int n[100];
public:
Data() { for(int i=0;i<100;i++) {n[i]=0;} }
};
把这个对象放入vector,如果用10万来测试,发现时间开销大得惊人。

不过还是挺有意思的,我们一般不会把一个对象直接放入vector,都是在堆上分配了然后把指针放进去。

下面这段代码测试100万个int的删除操作,list花了大概2分钟,vector花了10分钟。所以10万看来还没体现出list的优势,更大的数据量才能看到list的优势。

#include <vector>
#include <list>
#include <iostream>
#include <time.h>
#define SIZE 1000000

using namespace std;

void main()
{
vector<int> *pvec = new vector<int>;
list<int> *plist = new list<int>;

for(int i=0;i<SIZE;i++)
{
pvec->insert(pvec->end(), 1);
}
for(int i=0;i<SIZE;i++)
{
plist->insert(plist->begin(), 1);
}

time_t t1, t2;

time(&t1);
for(int i=0;i<SIZE;i++)
{
plist->erase(plist->begin());
}
time(&t2);
cout << t2-t1 << endl;

time(&t1);
for(int i=0;i<SIZE;i++)
{
pvec->erase(pvec->begin());
}
time(&t2);
cout << t2-t1 << endl;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式