温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

stl::list的size实现太有问题啦

发布时间:2020-07-16 15:05:46 来源:网络 阅读:1544 作者:angel_64 栏目:编程语言

这几天做一个程序,在遍历一个100万个数据的LIST的时候非常非常慢,我把可能出现消耗时间都打印出来了,死活都找不到消耗时间的地方在什么地方。

最后盯上了判断size()等于一个值的地方,因为就剩下这个地方了,就打上了时间,结果发现竟然就是此处。一个size方法竟然消耗了0.02秒。注释掉后就一切正常了。最后的解决办法只好我帮助它来计数。

写了个小程序,发现list的size果然消耗时间,不过幸运的是empty不消耗时间。

而最幸运的是最常用的map的size并不消耗时间。

有空看看源码吧,难道每次size都要从头计算一次吗?

#include<list>
#include<sys/time.h>
#include<stdio.h>
using namespace std;


void p1()
{
struct timeval start;
gettimeofday(&start, 0);
printf("%u,%u\n",start.tv_sec,start.tv_usec);


}


int main()
{
list<int> lista;
p1();
for(int i=0;i<10000;i++)
lista.push_back(1);

p1();

for(int i=0;i<1000;i++)
{
lista.size();
lista.pop_front();
}
p1();

for(int i=0;i<1000;i++)
lista.pop_front();
p1();
return 0;
}

结果:
1238513193,693237
1238513193,695993
1238513193,795487
1238513193,795597

只是1W个数据就这样慢的,100W的数据更是慢的惊人。

--------------------------------------------------------------------

查了一下源码,果然是每次重新计算的,难道就为了节省4字节的空间?

size_type size() const {
    size_type __result = 0;
    distance(begin(), end(), __result);
    return __result;
}


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI