前言
测试QList和QVector的数据插入和删除的速度。
代码如下(示例):
//以函数对象的形式定义查找规则--升序--MftNumber
class ascendingOrder {
public:
bool operator()(const int& i, const int& j) {
return i < j;
}
};
//快速查找
/*
* 查找列表中不小于数据查找到返回当前位置的迭代器,否则返回大于迭代器的第一个位置。
* 前提是排序好的列表,算法采用的是折半查找。
*/
template<class ForwardIterator, class T, class Compare>
QPair<ForwardIterator,ForwardIterator> quickFind(ForwardIterator first, ForwardIterator last, const T& val, Compare comp)
{
ForwardIterator it = qLowerBound (first,last,val,comp);
return qMakePair ( it, qUpperBound(it,last,val,comp) );
}
int main(int argc, char *argv[])
{
int ttt= 100000;//测试100000个数据
QTime t;
t.start();
QList<int> list;
for(int i=0;i<ttt;i++)
{
list.append(i);
}
qDebug()<<"list:"<<t.restart();
for(int i=0;i<ttt;i++)
{
QPair<QList<int>::iterator,QList<int>::iterator> j = quickFind(list.begin(),list.end(),list.at(i),ascendingOrder());
quint64 pos = j.first - list.begin();//获取插入点
list.insert(pos,i);
}
qDebug()<<"list插入:"<<t.restart();
for(int i=0;i<ttt;i++)
{
QPair<QList<int>::iterator,QList<int>::iterator> j = quickFind(list.begin(),list.end(),list.at(i),ascendingOrder());
quint64 pos = j.first - list.begin();//获取插入点
list.removeAt(pos);
}
qDebug()<<"list刪除:"<<t.restart();
QVector<int> vector;
for(int i=0;i<ttt;i++)
{
vector.append(i);
}
qDebug()<<"vector:"<<t.restart();
for(int i=0;i<ttt;i++)
{
QPair<QVector<int>::iterator,QVector<int>::iterator> j = quickFind(vector.begin(),vector.end(),vector.at(i),ascendingOrder());
quint64 pos = j.first - vector.begin();//获取插入点
vector.insert(pos,i);
}
qDebug()<<"vector插入:"<<t.restart();
for(int i=0;i<ttt;i++)
{
QPair<QVector<int>::iterator,QVector<int>::iterator> j = quickFind(vector.begin(),vector.end(),vector.at(i),ascendingOrder());
quint64 pos = j.first - vector.begin();//获取插入点
vector.removeAt(pos);
}
qDebug()<<"vector刪除:"<<t.restart();
list.clear();
for(int i=0;i<ttt;i++)
{
list.append(i);
}
qDebug()<<"list:"<<t.restart();
for(int i=0;i<ttt;i++)
{
QPair<QList<int>::iterator,QList<int>::iterator> j = quickFind(list.begin(),list.end(),list.at(i),ascendingOrder());
//quint64 pos = j.first - list.begin();//获取插入点
list.insert(j.second,i);
}
qDebug()<<"list迭代器插入:"<<t.restart();
for(int i=0;i<ttt;i++)
{
QPair<QList<int>::iterator,QList<int>::iterator> j = quickFind(list.begin(),list.end(),list.at(i),ascendingOrder());
//quint64 pos = j.first - list.begin();//获取插入点
list.erase(j.first);
}
qDebug()<<"list迭代器刪除:"<<t.restart();
vector.clear();
for(int i=0;i<ttt;i++)
{
vector.append(i);
}
qDebug()<<"vector:"<<t.restart();
for(int i=0;i<ttt;i++)
{
QPair<QVector<int>::iterator,QVector<int>::iterator> j = quickFind(vector.begin(),vector.end(),vector.at(i),ascendingOrder());
//quint64 pos = j.first - vector.begin();//获取插入点
vector.insert(j.second,i);
}
qDebug()<<"vector迭代器插入:"<<t.restart();
for(int i=0;i<ttt;i++)
{
QPair<QVector<int>::iterator,QVector<int>::iterator> j = quickFind(vector.begin(),vector.end(),vector.at(i),ascendingOrder());
//quint64 pos = j.first - vector.begin();//获取插入点
vector.erase(j.first);
}
qDebug()<<"vector迭代器刪除:"<<t.restart();
return 0;
}
list: 2
list插入: 65
list刪除: 57
vector: 2
vector插入: 4587
vector刪除: 338
list: 3
list迭代器插入: 3322
list迭代器刪除: 772
vector: 2
vector迭代器插入: 3296
vector迭代器刪除: 667
总结:append();追加速度vector快一些;从中间插入或删除QList比QVector快7-8倍。
范围删除用:list.erase(list.begin(),list.begin()+10000);//速度是瞬间的