Khiêu chuyển chí

Độc nhập, thâu xuất ưu hóa

Tại mặc nhận tình huống hạ,std::cin/std::coutThị cực vi trì hoãn đích độc nhập / thâu xuất phương thức, nhiscanf/printfBỉstd::cin/std::coutKhoái đắc đa.

Chú ý

cin/coutDữscanf/printfĐích thật tế tốc độ soa hội tùy biên dịch khí hòa thao tác hệ thống đích bất đồng phát sinh nhất định đích cải biến. Như quả tưởng yếu tiến hành tường tế đối bỉ, thỉnh dĩ thật tế trắc thí kết quả vi chuẩn.

Hạ văn tương tường tế giới thiệu độc nhập thâu xuất đích ưu hóa phương pháp.

Quan bế đồng bộ / giải trừ bảng định

std::ios::sync_with_stdio(false)

Giá cá hàm sổ thị nhất cá “Thị phủ kiêm dung stdio” đích khai quan, C++ vi liễu kiêm dung C, bảo chứng trình tự tại sử dụng liễuprintfHòastd::coutĐích thời hầu bất phát sinh hỗn loạn, tương thâu xuất lưu bảng đáo liễu nhất khởi. Đồng bộ đích thâu xuất lưu thị tuyến trình an toàn đích.

Giá kỳ thật thị C++ vi liễu kiêm dung nhi thải thủ đích bảo thủ thố thi, dã thị sửcin/coutTốc độ giác mạn đích chủ yếu nguyên nhân. Ngã môn khả dĩ tại tiến hành IO thao tác chi tiền tương stdio giải trừ bảng định, đãn thị tại giá dạng tố chi hậu yếu chú ý bất năng đồng thời sử dụngstd::cinHòascanf,Dã bất năng đồng thời sử dụngstd::coutHòaprintf,Đãn thị khả dĩ đồng thời sử dụngstd::cinHòaprintf,Dã khả dĩ đồng thời sử dụngscanfHòastd::cout.

tie

tie thị tương lưỡng cá stream bảng định đích hàm sổ, không tham sổ đích thoại phản hồi đương tiền đích thâu xuất lưu chỉ châm.

Tại mặc nhận đích tình huống hạstd::cin.tie()Bảng định đích thị&std::cout,Mỗi thứ tiến hành cách thức hóa thâu nhập đích thời hầu đô yếu điều dụngstd::cout.flush()Thanh không thâu xuất hoãn trùng khu, giá dạng hội tăng gia IO phụ đam. Khả dĩ thông quástd::cin.tie(nullptr)Lai giải trừ bảng định, tiến nhất bộ gia khoái chấp hành hiệu suất.

Đãn nhu yếu chú ý đích thị, tại giải trừ liễustd::cinHòastd::coutĐích bảng định hậu, trình tự trung tất tu thủ độngflushTài năng xác bảo mỗi thứstd::coutTriển hiện đích nội dung khả dĩ tạistd::cinTiền xuất hiện. Giá thị nhân vistd::coutBị buffer vi mặc nhận thiết trí. Lệ như:

1
2
3
4
5
6
std::cout"Please input your name:"
std::flush;// hoặc giả: std::endl;
// nhân vi mỗi thứ điều dụng std::endl đô hội flush thâu xuất hoãn trùng khu, nhi \n
// tắc bất hội.
// đãn thỉnh cẩn thận sử dụng, quá đa đích flush hội ảnh hưởng trình tự hiệu suất
std::cin>>name;

Đại mã thật hiện

1
2
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);

Độc nhập ưu hóa

scanfHòaprintfY nhiên hữu ưu hóa đích không gian, giá tựu thị bổn chương sở giới thiệu đích nội dung —— độc nhập hòa thâu xuất ưu hóa.

  • Chú ý, bổn hiệt diện trung giới thiệu đích độc nhập hòa thâu xuất ưu hóa quân châm đối chỉnh hình sổ cư, nhược yếu chi trì kỳ tha loại hình đích sổ cư ( như phù điểm sổ ), khả tự hành án chiếu bổn hiệt diện giới thiệu đích ưu hóa nguyên lý lai biên tả đại mã.

Nguyên lý

Chúng sở chu tri,getcharThị dụng lai độc nhập 1 byte đích sổ cư tịnh tương kỳ chuyển hoán vicharLoại hình đích hàm sổ, thả tốc độ ngận khoái, cố khả dĩ dụng “Độc nhập tự phù —— chuyển hoán vi chỉnh hình” lai đại thế hoãn mạn đích độc nhập.

Mỗi cá chỉnh sổ do lưỡng bộ phân tổ thành —— phù hào hòa sổ tự.

Chỉnh sổ đích '+' thông thường thị tỉnh lược đích, thả bất hội đối hậu diện sổ tự sở đại biểu đích trị sản sinh ảnh hưởng, nhi '-' bất khả tỉnh lược, nhân thử yếu tiến hành phán định.

10 tiến chế chỉnh sổ trung thị bất hàm không cách hoặc trừ 0~9 hòa chính phụ hào ngoại đích kỳ tha tự phù đích, nhân thử tại độc nhập bất ứng tồn tại vu chỉnh sổ trung đích tự phù ( thông thường vi không cách ) thời, tựu khả dĩ phán định dĩ kinh độc nhập kết thúc.

C hòa C++ ngữ ngôn phân biệt tại ctype.h hòa cctype đầu văn kiện trung, đề cung liễu hàm sổisdigit,Giá cá hàm sổ hội kiểm tra truyện nhập đích tham sổ thị phủ vi thập tiến chế sổ tự tự phù, thị tắc phản hồitrue,Phủ tắc phản hồifalse.Đối ứng đích, tại hạ diện đích đại mã trung, khả dĩ sử dụngisdigit(ch)Đại thếch >= '0' && ch, dã khả dĩ sử dụng!isdigit(ch)Đại thếch '9'.

Đại mã thật hiện

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
intread(){
intx=0,w=1;
charch=0;
while(ch'0'||ch>'9'){// ch bất thị sổ tự thời
if(ch=='-')w=-1;// phán đoạn thị phủ vi phụ
ch=getchar();// kế tục độc nhập
}
while(ch>='0'&&ch'9'){// ch thị sổ tự thời
x=x*10+(ch-'0');// tương tân độc nhập đích sổ tự “Gia” tại x đích hậu diện
// x thị int loại hình, char loại hình đích ch hòa '0' hội bị tự động chuyển vi kỳ đối ứng đích
// ASCII mã, tương đương vu tương ch chuyển hóa vi đối ứng sổ tự
// thử xử dã khả dĩ sử dụng (x
ch=getchar();// kế tục độc nhập
}
returnx*w;// sổ tự * chính phụ hào = thật tế sổ trị
}
  • Cử lệ

Độc nhập num khả tả vinum=read();.

Thâu xuất ưu hóa

Nguyên lý

Đồng dạng thị chúng sở chu tri,putcharThị dụng lai thâu xuất đan cá tự phù đích hàm sổ.

Nhân thử tương sổ tự đích mỗi nhất vị chuyển hóa vi tự phù thâu xuất dĩ gia tốc.

Yếu chú ý đích thị, phụ hào yếu đan độc phán đoạn thâu xuất, tịnh thả mỗi thứ % ( mod ) thủ xuất đích thị sổ tự mạt vị, nhân thử yếu đảo tự thâu xuất.

Đại mã thật hiện

1
2
3
4
5
6
7
8
voidwrite(intx){
if(x0){// phán phụ + thâu xuất phụ hào + biến nguyên sổ vi chính sổ
x=-x;
putchar('-');
}
if(x>9)write(x/10);// đệ quy, tương trừ tối hậu nhất vị ngoại đích kỳ tha bộ phân phóng đáo đệ quy trung thâu xuất
putchar(x%10+'0');// dĩ kinh thâu xuất ( đệ quy ) hoàn x mạt vị tiền đích sở hữu sổ tự, thâu xuất mạt vị
}

Đãn thị đệ quy thật hiện thường sổ thị giác đại đích, ngã môn khả dĩ tả nhất cá sạn lai thật hiện giá cá quá trình.

1
2
3
4
5
6
7
8
voidwrite(intx){
staticintsta[35];
inttop=0;
do{
sta[top++]=x%10,x/=10;
}while(x);
while(top)putchar(sta[--top]+48);// 48 thị '0'
}
  • Cử lệ

Thâu xuất num khả tả viwrite(num);.

Canh khoái đích độc nhập / thâu xuất ưu hóa

Thông quáfreadHoặc giảmmapKhả dĩ thật hiện canh khoái đích độc nhập.

freadNăng tương nhu yếu đích văn kiện bộ phân độc nhập nội tồn hoãn trùng khu.mmapTắc hội điều độ nội hạch cấp hàm sổ, tương văn kiện nhất thứ tính địa ánh xạ đáo nội tồn trung, loại tự vu khả dĩ chỉ châm dẫn dụng đích nội tồn khu vực. Sở dĩ tại nhật thường trình tự độc tả thời, chỉ nhu yếu trọng phục độc thủ bộ phân văn kiện khả dĩ sử dụngfread,Nhân vi như quả dụngmmapPhản phục độc thủ nhất tiểu khối văn kiện, tố nhất thứ tính nội tồn ánh xạ tịnh thả nội hạch xử lý page fault đích hoa phí hội viễn bỉ sử dụngfreadĐích nội hạch cấp hàm sổ điều độ đại.

Nhất thứ tính độc nhập hoãn trùng khu đích thao tác bỉ trục cá tự phù độc nhập (getchar,putchar) yếu khoái đích đa. Nhân vi ngạnh bàn đích đa thứ độc tả tốc độ thị yếu mạn vu trực tiếp độc thủ nội tồn đích, sở dĩ tiên nhất thứ tính độc đáo hoãn tồn khu lí tái tòng hoãn tồn khu độc nhập yếu khoái đích đa. Tịnh thảmmapXác bảo liễu tiến trình gian tự động cộng hưởng, tồn trữ khu như quả khả dĩ dã hội dữ nội hạch hoãn tồn phân hưởng tín tức, xác bảo liễu canh thiếu đích khảo bối thao tác.

Canh thông dụng đích thịfread,Nhân vimmapBất năng tại Windows hoàn cảnh hạ sử dụng ( lệ như CodeForces đích tester ).

freadLoại tự vu tham sổ vi"%s"Đíchscanf,Bất quá tha canh vi khoái tốc, nhi thả khả dĩ nhất thứ tính độc nhập nhược càn cá tự phù ( bao quát không cách hoán hành đẳng chế biểu phù ), như quả hoãn tồn khu túc cú đại, thậm chí khả dĩ nhất thứ tính độc nhập chỉnh cá văn kiện.

Đối vu thâu xuất, ngã môn hoàn hữu đối ứng đíchfwriteHàm sổ.

1
2
3
4
std::size_tfread(void*buffer,std::size_tsize,std::size_tcount,
std::FILE*stream);
std::size_tfwrite(constvoid*buffer,std::size_tsize,std::size_tcount,
std::FILE*stream);

Sử dụng kỳ lệ:fread(Buf, 1, SIZE, stdin),Biểu kỳ tòng stdin văn kiện lưu trung độc nhập SIZE cá đại tiểu vi 1 byte đích sổ cư khối đáo Buf trung.

Độc nhập chi hậu đích sử dụng tựu cân phổ thông đích độc nhập ưu hóa tương tự liễu, chỉ nhu yếu trọng định nghĩa nhất hạ getchar. Tha nguyên lai thị tòng văn kiện trung độc nhập nhất cá char, hiện tại biến thành tòng Buf trung độc nhập nhất cá char, dã tựu thị đầu chỉ châm hướng hậu di động nhất vị.

1
2
3
4
5
charbuf[120],*p1,*p2;
#define gc() \
(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1
?EOF \
:*p1++)

fwriteDã thị loại tự đích, tiên phóng nhập nhất cáOutBuf[MAXSIZE]Trung, tối hậu thông quáfwriteNhất thứ tính tươngOutBufThâu xuất.

Tham khảo đại mã:

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
namespaceIO{
constexprintMAXSIZE=120;
charbuf[MAXSIZE],*p1,*p2;
#define gc() \
(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) \
?EOF \
:*p1++)

intrd(){
intx=0,f=1;
charc=gc();
while(!isdigit(c)){
if(c=='-')f=-1;
c=gc();
}
while(isdigit(c))x=x*10+(c^48),c=gc();
returnx*f;
}

charpbuf[120],*pp=pbuf;

voidpush(constchar&c){
if(pp-pbuf==120)fwrite(pbuf,1,120,stdout),pp=pbuf;
*pp++=c;
}

voidwrite(intx){
staticintsta[35];
inttop=0;
do{
sta[top++]=x%10,x/=10;
}while(x);
while(top)push(sta[--top]+'0');
}
}// namespace IO

Thâu nhập thâu xuất đích hoãn trùng

printfHòascanfThị hữu hoãn trùng khu đích. Giá dã tựu thị vi thập ma, như quả thâu nhập hàm sổ khẩn cân tại thâu xuất hàm sổ chi hậu / thâu xuất hàm sổ khẩn cân tại thâu nhập hàm sổ chi hậu khả năng đạo trí thác ngộ.

Xoát tân thâu xuất hoãn trùng khu đích điều kiện

  1. Trình tự kết thúc;
  2. Quan bế văn kiện;
  3. printfThâu xuất\rHoặc giả\nĐáo chung đoan đích thời hầu ( chú: Như quả thị thâu xuất đáo văn kiện, tắc bất hội xoát tân hoãn trùng khu );
  4. Thủ độngfflush();
  5. Hoãn trùng khu mãn tự động xoát tân;
  6. coutThâu xuấtendl;
  7. Thủ độngcout.flush().

Sử thâu nhập thâu xuất ưu hóa canh vi thông dụng

Như quả nhĩ đích trình tự sử dụng đa cá loại hình đích biến lượng, na ma khả năng nhu yếu tả đa cá thâu nhập thâu xuất ưu hóa đích hàm sổ. Hạ diện cấp xuất đích đại mã sử dụngC++ trung đíchtemplateThật hiện liễu đối vu sở hữu chỉnh sổ loại hình đích thâu nhập thâu xuất ưu hóa.

1
2
3
4
5
6
7
8
9
10
// thanh minh template loại, yếu cầu đề cung thâu nhập đích loại hình T, tịnh dĩ thử loại hình định nghĩa nội liên hàm sổ read()
templatetypenameT>
Tread(){
Tsum=0,fl=1;// tương sum,fl hòa ch dĩ thâu nhập đích loại hình định nghĩa
intch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')fl=-1;
for(;isdigit(ch);ch=getchar())sum=sum*10+ch-'0';
returnsum*fl;
}

Như quả yếu phân biệt thâu nhậpintLoại hình đích biến lượng a,long longLoại hình đích biến lượng b hòa__int128Loại hình đích biến lượng c, na ma khả dĩ tả thành:

1
2
3
a=readint>();
b=readlonglong>();
c=read__int128>();

Hoàn chỉnh đái điều thí bản

Quan bế điều thí khai quan thời sử dụngfread(),fwrite(),Thối xuất thời tự động tích cấu chấp hànhfwrite().

Khai khải điều thí khai quan thời sử dụnggetchar(),putchar(),Tiện vu điều thí.

Nhược yếu khai khải văn kiện độc tả thời, thỉnh tại sở hữu độc tả chi tiền gia nhậpfreopen().

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
61
62
63
64
65
66
67
68
69
70
71
72
73
// #define DEBUG 1 // điều thí khai quan
structIO{
#define MAXSIZE (1
#define isdigit(x) (x >= '0' && x
charbuf[MAXSIZE],*p1,*p2;
charpbuf[MAXSIZE],*pp;
#if DEBUG
#else
IO():p1(buf),p2(buf),pp(pbuf){}

~IO(){fwrite(pbuf,1,pp-pbuf,stdout);}
#endif
chargc(){
#if DEBUG// điều thí, khả hiển kỳ tự phù
returngetchar();
#endif
if(p1==p2)p2=(p1=buf)+fread(buf,1,MAXSIZE,stdin);
returnp1==p2?' ':*p1++;
}

boolblank(charch){
returnch==' '||ch=='\n'||ch=='\r'||ch=='\t';
}

templateclassT>
voidread(T&x){
doubletmp=1;
boolsign=false;
x=0;
charch=gc();
for(;!isdigit(ch);ch=gc())
if(ch=='-')sign=1;
for(;isdigit(ch);ch=gc())x=x*10+(ch-'0');
if(ch=='.')
for(ch=gc();isdigit(ch);ch=gc())
tmp/=10.0,x+=tmp*(ch-'0');
if(sign)x=-x;
}

voidread(char*s){
charch=gc();
for(;blank(ch);ch=gc());
for(;!blank(ch);ch=gc())*s++=ch;
*s=0;
}

voidread(char&c){for(c=gc();blank(c);c=gc());}

voidpush(constchar&c){
#if DEBUG// điều thí, khả hiển kỳ tự phù
putchar(c);
#else
if(pp-pbuf==MAXSIZE)fwrite(pbuf,1,MAXSIZE,stdout),pp=pbuf;
*pp++=c;
#endif
}

templateclassT>
voidwrite(Tx){
if(x0)x=-x,push('-');// phụ sổ thâu xuất
staticTsta[35];
Ttop=0;
do{
sta[top++]=x%10,x/=10;
}while(x);
while(top)push(sta[--top]+'0');
}

templateclassT>
voidwrite(Tx,charlastChar){
write(x),push(lastChar);
}
}io;

Tham khảo

cin.tie dữ sync_with_stdio gia tốc thâu nhập thâu xuất - mã nông tràng

C++ cao tốc hóa - Heavy Watal

'Re: mmap/mlock performance versus read' - MARC