getchar_unlocked()与scanf()与cin的区别

14

这三个编程语言中的输入函数有什么区别?它们的输入方式是否不同?

1.getchar_unlocked()

 #define getcx getchar_unlocked

 inline void inp( int &n ) 
 {
    n=0;
    int ch=getcx();int sign=1;
    while( ch < '0' || ch > '9' ){if(ch=='-')sign=-1; ch=getcx();}

    while(  ch >= '0' && ch <= '9' )
            n = (n<<3)+(n<<1) + ch-'0', ch=getcx();
    n=n*sign;
  }   

2.scanf("%d",&n)

3.cin>>n

输入整数时,哪个方法耗时最短?我在C++中使用了这些头文件,在C++中所有三种情况都可以运行。

  #include<iostream>
  #include<vector>
  #include<set>
  #include<map>
  #include<queue>
  #include<stack>
  #include<string>
  #include<algorithm>
  #include<functional>
  #include<iomanip>
  #include<cstdio>
  #include<cmath>
  #include<cstring>
  #include<cstdlib>
  #include<cassert>

在C++编程中,你想要使用 cin。由于您提供了C和C++标签,因此很难给出一个好的答案。您使用的是哪种语言?它们不是同一种语言。 - Cody Gray
2
由于C语言中不存在cin,因此已删除c标签。 - Fred Foo
2个回答

29

有两点需要考虑。

  1. getchar_unlocked 在 Windows 中已被弃用,因为它是 getchar() 的线程不安全版本。

  2. 除非速度因素非常必要,否则尽量避免使用 getchar_unlocked

现在,就速度而言。

    getchar_unlocked > getchar

由于在getchar_unlocked中没有输入流锁检查,因此它不安全。

    getchar > scanf

因为getchar只能读取一个字符,其类型是char,而scanf可以读取C语言中大多数的基本类型。

    scanf > cin (>> operator)

因为查看这个链接

所以,最后

getchar_unlocked > getchar > scanf > cin

我不明白这个比较:getchar_unlocked > getchar > scanf > cin,因为除了 cin(它是一个对象)外,所有其他都是函数。比较函数的速度是有意义的。但是,你怎么能比较函数和对象呢?这甚至毫无意义。但是,你可以将这些函数与 cin 支持的各种函数进行比较,例如 operator>> 重载和 read(),它们具有不同的权衡,例如 read()operator>> 更快,但它不会格式化缓冲区。 - Nawaz
@Nawaz,答案在问题的上下文中,其中明确说明比较是在函数之间进行的。 - Sobhagya Mohanty
我是说你没有在比较函数。 - Nawaz
1
只是为了澄清一下。上面所述的比较都是关于可用的读取函数之间的比较。尽管我没有专门提到cin对象中的operator>>函数。 - Sobhagya Mohanty
如果你没有提到它,那么你的帖子就是误导性的。 - Nawaz

4

在Codechef中遇到了一个问题,需要输入许多整数。发现char_unlocked()比scanf更快,而scanf比cin更快。


一个明确指出“数据集非常大,使用更快的I/O方法”的问题:[http://uva.onlinejudge.org/external/124/12440.html] - thiagowfx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接