我在输入流(来自键盘)中有大约1E6
行。以下是我如何阅读本文:
int main () {
ul n, in;
scanf("%lu", &n);
ul *a = new ul[n];
while(n--){
scanf("%lu", a+n);
}
n
是要读取的行数。
ul
unsigned long
我在其他地方定义了。
为了澄清,数据是一组整数(< 1E9
),它们由换行符(\n
)从键盘输入流分隔。
这种方法正在完成这项工作,但我想加快速度。 我考虑过使用缓冲区将整个流读取到内存并解析,但我无法弄清楚如何使用C ++ 11来实现。
我使用stdio.h
来读取流,因为它似乎比C ++流读取器更快。否则,我更喜欢C ++ 11解决方案。
答案 0 :(得分:0)
我认为您可以通过编辑while循环来略微提高性能。
由于数字小于1e9,您可以读取 int ,而不是 uns。长的。
在下面的代码中,我通过 getc 读取每个字符,然后将其转换为数字
请注意,current_number是 int
为了编码工作,你必须修改你的第一个 scanf(“%lu”,& n); 同时阅读'\ n',即您的第一个scanf将是 scanf(“%lu \ n”,& n);
while (n--) {
int c = getc(stdin);
int current_number = 0;
do {
current_number = (current_number << 1) + (current_number << 3) + (c - 48);
c = getc(stdin);
} while (c >= 48 && c <= 57);
a[n] = current_number;
}
scanf 功能在大数据上比 getc 更慢。
(current_number&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;现代编译器能够找出计算小型操作的最佳方法。
祝你好运