我在输入流中有大约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解决方案。
我认为你可以通过编辑while循环来略微提高性能。
因为数字小于1e9,所以你可以读int,而不是uns。。在下面的代码中,我通过getc读取每个字符并将其转换为数字。注意current_number是int
为了使代码工作,你必须修改第一个 scanf("%lu", &n);通过读取 'n'来读取,即您的第一次扫描将是 scanf("%lun", &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 <<1) + (current_number <<3) 等于 current_number * 10 ,但我认为没有必要。现代编译器能够找出计算小操作的最佳方法。
祝你好运