如何提高标准输入输出流的速度

在网上查看别人的ACM代码时,发现别人输入输出语句用的总是scanf与printf,有点不解,还以为他们用的都是C语言,而非C++,但今天做的一道题(Sort):

发现与网上的其他高手使用完全相同的方法,使用scanf及printf的代码提交后Accepted,而使用cin及cout的却Time Limit Exceeded,代码如下:

代码一(Accepted):

 
 
  1. #include<iostream>
  2. using namespace std;
  3. bool a[1000001];
  4. int main()
  5. {
  6.     int n, m, num, count;
  7.     while(scanf("%d%d",&n,&m)!=EOF){
  8.         memset(a, 0, sizeof(a));
  9.         for(int i=0; i<n; i++){
  10.             scanf("%d",&num);
  11.             a[num + 500000] = 1;
  12.         }
  13.         count = 0;
  14.         for(int j = 1000000; j >= 0; --j){
  15.             if(a[j]){
  16.                 if(count == m - 1){
  17.                      printf("%d\n",j-500000);
  18.                     break;
  19.                 }
  20.                 printf("%d ",j-500000);
  21.                 count++;
  22.             }
  23.         }
  24.     }
  25.     return 0;
  26. }

代码二(Time Limit Exceeded):

 
 
  1. #include<iostream>
  2. using namespace std;
  3. bool a[1000001];
  4. int main()
  5. {
  6.     int n, m, num, count;
  7.     while(cin >> n >> m){
  8.         memset(a, 0, sizeof(a));
  9.         for(int i=0; i<n; i++){
  10.             cin >> num;
  11.             a[num + 500000] = 1;
  12.         }
  13.         count = 0;
  14.         for(int j = 1000000; j >= 0; --j){
  15.             if(a[j]){
  16.                 if(count == m - 1){
  17.                     cout << j - 500000 << endl;
  18.                     break;
  19.                 }
  20.                 cout << j - 500000 << " ";
  21.                 count++;
  22.             }
  23.         }
  24.     }
  25.     return 0;
  26. }

可以看出,代码思路完全一样,只是输入输出方法不同,问过老师,加上这一句代码后使用cin及cout也可以Accepted:

 
 
  1. std::ios::sync_with_stdio(false);

百度了一下,原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是iostream。

如需转载请注明出处:http://www.clanfei.com/2012/03/235.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值