标签:
今天看同事写的代码里有如下的代码:
for(int i =0;i < map_T.count(); i++)
{
T * t = map_T.value(map_T.keys().at(i));
}
我评论到这样速度太慢(其实内容不多,用什么方式遍历用户是感觉不到的)应该用迭代器遍历,结果引起激烈的讨论,同时还讨论到了链表的遍历方法,并且还拿群里给出的数据说明用“下标”遍历链表比用迭代器快。
于是我自己也写了段代码进行测试(测试代码很easy,就不粘贴了),结果显示,map用key去遍历value的速度比直接用迭代器慢了十倍多,因为使用key去访问value时,每一次访问都会引起二分查找,而用迭代器访问时,时间复杂度为O(1)(我没去分析源码,猜的),必然要比用key去一个个索引value快。
而在测试链表时,我突然发现STL中的list根本就没提供下标访问函数,原因是用下标访问的最坏时间复杂度太大,例如当链表长度很大时,要用下标去访问中间的一个结点时,必然要经过很多步的间接访问。
说出了这个情况后,同事说Qt中提供的QList有提供QList<T>::at(int)函数,用于下标访问,并且速度比迭代器快,我不服,不服跑个分呗,于是又进行测试,结果却是,用at函数遍历比用迭代器快了近一倍,不解啊,于是就去分析QList的源代码了,结果发现下面这段代码:
struct Q_CORE_EXPORT QListData {
struct Data {
QtPrivate::RefCount ref;
int alloc, begin, end;
void *array[1];
};
Data *d;
inline void **at(int i) const { return d->array + d->begin + i; }
inline void **begin() const { return d->array + d->begin; }
inline void **end() const { return d->array + d->end; }
/// .........................
};
算是好好上了一课。
估计Qt是为了提高速度,使用了连续内存,提高了随机访问的速度,看来不能拿其它库和自己相对熟悉点的STL比啊,毕竟有些库是做了优化的,不能固化自己的知识。
标签:
原文地址:http://www.cnblogs.com/BYSF-XF/p/4279162.html