STL库中list前端删除居然比vector慢
list按理说在插入和删除方面应该比vector快的多才是,对于百万量级以上list确实比vector快的多。可是对于容器大小都为10万的vector和list,从前端依...
list按理说在插入和删除方面应该比vector快的多才是,对于百万量级以上list确实比vector快的多。可是对于容器大小都为10万的vector和list,从前端依次删除vector所有元素要3s左右,而list却需要8s多,这到底是什么原因?求大牛指导。运行环境是VS2010。
展开
展开全部
还真挺有意思的,我刚才试了下,确实这样。
用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;
}
用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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询