Optimized Input and Output in C++

Background

C++标准库<iostream>中的cin, cout相比<cstdio>中的scanf, printf要方便许多,但速度也较为缓慢。在输入输出的数据类型不是很特殊时,可以使用以下代码来代替cin, cout(要包含<cctype>, <cstdio>,不要包含<iostream>)。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class InputStream {
private:
static int const BUFFER_SIZE = 10000000;
char *buffer;

public:
InputStream() {
buffer = new char[BUFFER_SIZE]();
fread(buffer, sizeof(char), BUFFER_SIZE, stdin);
}
InputStream &operator>>(int &n) {
for (; *buffer < '0' || *buffer > '9'; ++buffer)
;
for (n = 0; *buffer >= '0' && *buffer <= '9';
(n *= 10) += *(buffer++) - '0')
;
return *this;
}
InputStream &operator>>(char &c) {
for (; !isprint(*buffer) || *buffer == ' '; ++buffer)
;
c = *(buffer++);
return *this;
}
InputStream &operator>>(char *s) {
char *t = s;
for (; !isprint(*buffer) || *buffer == ' '; ++buffer)
;
for (; isprint(*buffer) && *buffer != ' '; *(t++) = *(buffer++))
;
*t = '\0';
return *this;
}
} cin;

class OutputStream {
private:
static int const BUFFER_SIZE = 10000000;
char *buffer, *cur;

public:
OutputStream() { buffer = cur = new char[BUFFER_SIZE](); }
~OutputStream() { fwrite(buffer, sizeof(char), cur - buffer, stdout); }
OutputStream &operator<<(int const &n) {
for (sprintf(cur, "%d", n); *cur; ++cur)
;
return *this;
}
OutputStream &operator<<(char const &c) {
*(cur++) = c;
return *this;
}
OutputStream &operator<<(char *s) {
for (char *t = s; *t; *(cur++) = *(t++))
;
return *this;
}
} cout;

static char const endl = '\n';

Optimized Input and Output in C++
https://regmsif.cf/2018/03/14/coding/optimized-input-and-output-in-c/
作者
RegMs If
发布于
2018年3月14日
许可协议