码迷,mamicode.com
首页 > 其他好文 > 详细

遍历map和list的速度问题

时间:2015-02-07 18:52:57      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

今天看同事写的代码里有如下的代码:

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比啊,毕竟有些库是做了优化的,不能固化自己的知识。

遍历map和list的速度问题

标签:

原文地址:http://www.cnblogs.com/BYSF-XF/p/4279162.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!