1. 程式人生 > >C++ 讀入/輸出優化

C++ 讀入/輸出優化

考試時若題目有大量輸入輸出,最好使用讀入/輸出優化.

scanf與printf比cin和cout快,而getchar和putchar是最快的(這兩個函式本是讀/寫一個字元的,這裡用作優化).

(一)手寫優化

版本1:

<cctype>:isdigit(x)判斷x是否為十進位制整數

#include <iostream>
#include <cstdio>
#include <cctype>
using namespace std;

int Read() {
	char c;
	int ans = 0;
	bool Sign = false;
	while(!isdigit(c=getchar()) && c != '-');    //去除非法字元
	if(c == '-') {
		Sign = true;
		c = getchar();
	}
	do {
		ans = ans * 10 + (c - '0');
	}while(isdigit(c=getchar()));
	return Sign ? -ans : ans;
}

void Write(int x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	if(x >= 10) Write(x / 10);
	putchar(x % 10 + '0');
}

int main() {
	int a;
	a = Read();
	Write(a);
	return 0;
}


版本2:在某些地方再優化

1> inline關鍵字.一般將不是很複雜呼叫次數多的函式定義為inline(行內函數),在編譯時,編譯器會把該函式的程式碼副本放置在每個呼叫該函式的地方。這與define相似,可以提高速度.(不要濫用於長函式)

2> ans * 10改為了位運算:(ans << 3)+(ans << 1).

ans<<3就是ans*23 ans*8

同理,ans<<1就是ans*2;

因此(ans << 3)+(ans << 1)ans*10是相同的,在運算速度上有所提升;

#include <iostream>
#include <cstdio>
#include <cctype>
using namespace std;

inline int Read() {
	char c;
	int ans = 0;
	bool Sign = false;
	while(!isdigit(c=getchar()) && c != '-'); 
	if(c == '-') {
		Sign = true;
		c = getchar();
	}
	do {
		ans = (ans<<3) + (ans<<1) + (c - '0');
	}while(isdigit(c=getchar()));
	return Sign ? -ans : ans;
}

inline void Write(int x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	if(x >= 10) Write(x / 10);
	putchar(x % 10 + '0');
}

int main() {
	int a;
	a = Read();
	Write(a);
	return 0;
}


(二)優化cin、cout

要是不會scanf和printf,也不手寫優化,那就在主函式第一句寫上:

ios::sync_with_stdio(false);


這取消了cin、cout與scanf、printf的同步,可以加快速度,但不可再用scanf、printf了,會混亂的..

相關推薦

C++ /輸出優化

考試時若題目有大量輸入輸出,最好使用讀入/輸出優化. scanf與printf比cin和cout快,而getchar和putchar是最快的(這兩個函式本是讀/寫一個字元的,這裡用作優化). (一

輸出優化模板

log pan 直接 turn 系統底層 分鐘 none getchar spa 因為是直接調用系統底層所以速度會很快... 1 long long read(){ 2 long long x=0,w=1; 3 char c=0; 4

,輸出 優化

getchar() linu inline 充足 空間 lin 字符串 -1 dig 讀入 inline int read() { int x = 0, f = 1; char ch = getchar(); for(; !isdi

常用輸出優化

print 索引 getchar() 數組 printf 定義 max fine 一個 本文主要講述常用的2種讀入優化方法。 輸出優化很少使用,在此簡單提一下:也就是把輸出的東西先放進字符串,再一次性puts\printf出去。提升不大,不常用。 首先當然需要先知道,sca

NOIP2016T4暨洛谷P2119解題報告+輸出優化(原創+轉載)

Part 1: 解題報告(原創) 第一次 先來一波截圖: 評測網站:洛谷 首先,先說一說我第一次個人的思想,只想著暴力列舉: 程式碼 #include<iostream> #include<memory.h&g

c++輸出的探索』

對於讀入與輸出的探索和優化 ·cin和cout ·scanf和printf ·關閉同步流 ·freopen和fclose ·整型read ·浮點型與字串read ·快輸 ·fread <更新提示> <第一次更新> <正

c++優化模板

int getint() { char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar(); int res=0;

C++ 優化 fread()版本

今天被讀入優化坑慘了 因為一道隨便水水就能過的屎題,調了一下午我一直以為是我STL的鍋。 以後校OJ上讀入量超過10mb的題目,不寫這個優化,我名字倒著寫… 版本1 #include&l

c++優化(整數)

一、背景 這是某道題目的狀態: 我的程式碼: 大牛的程式碼: 我瞬間萌幣了! 我有這麼慢?Are you kidding me? 點進去一看: void Read(int & p) { p=0;

c++ 和寫入文件

spa end ofstream OS pen clu img ++ lin 讀入 #include<ifstream> ifstream infile; infile.open(img_dir); while(getline(infile,tmp)){

卡常神器——register 與 快速輸出

可能 () amp 很多 服務 char 讀取 get 裏的 快速讀入模板 int read() { int s = 0, w = 1; char ch = getchar(); //getchar() 一次從鍵盤讀入一個字符 while (ch &

c++ 一個字元

  #include <iostream> using namespace std; int main() {    char c;    cin>>c; //自動過濾掉不可見字元(如空格 回車 

快速輸出

普通快速讀入 inline void Read(int &x) { char c=getchar(); x=0; while (c<'0'||c>'9') { c=getchar(); } while (c&

C++一行字串

cin.getline(char * str, int size_t, char delim) 標頭檔案: #include<iostream> 引數1:字元陣列 引數2:讀入字串長度 引數3:終止符 示例: char str[105]; cin.ge

C++—— 一張bmp圖片,提取其影象資料,存入矩陣/txt檔案

本文章完成的是讀入bmp圖片、將資料存入矩陣/TXT檔案、儲存圖片的功能。在開始之前,我們需要了解bmp點陣圖的儲存方式:BMP檔案的資料按照從檔案頭開始的先後順序分為四個部分:(1)bmp檔案頭(bmp file header):提供檔案的格式、大小等資訊(2)點陣圖資訊頭

C/C++若干連續資料

如果題目要求你讀入若干個連續整數,其間用空格隔開,換行符作為輸入結束標準,數目不知道,要求你將輸入的數排序列印,求max,min,排序等 用優先佇列實現排序,當然使用set也可以 #include <iostream> #include <queue> using

c++字串:cin和getline的比較

c++輸入字串到string類可以用getline函式,第一個引數是cin,第二個引數是string類的變數,第三個引數是結束標誌。 該函式不會讀入結束標誌,而是跳過。 當cin>>從緩衝區中讀取資料時,若緩衝區中第一個字元是空格、tab或換行這些分隔符時,c

【墻裂推薦】優化輸出優化

return getchar() ret style getchar 決定 推薦 int div 讀入優化: 1 inline int read() 2 { 3 int X=0,w=1; char ch=0; 4 while(ch<‘0‘ || ch

優化 && 輸出優化

找到 getch oid 優化 include write tex utc getc qwq算是一個板子隨筆吧 快讀我在某大佬的博客中找到了更短的代碼 但是這個寫習慣了就改不了了qwq 其實是我不想改 廢話好多 直接貼代碼 1 //讀入優化 2 inline int

c語言 用getchar函式兩個字元給c1 c2 用putchar和printf輸出 思考問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!