2012-10-22 31 views
2

Here是我的代碼。我在這個問題提供了源,因爲它沒有那麼大:getchar_unlocked in windows unde undered

#include <stdio.h> 

void scan(int* i) 
{ 
    int t=0; 
    char c; 
    bool negative=false; 
    c=getchar_unlocked(); 
    while(c<'0'&&c>'9') 
    { 
     if(c=='-') 
      negative=true; 
     c=getchar_unlocked(); 
    } 
    while(c>'0'&&c<'9') 
    { 
     t=(t<<3)+(t<<1)+c-'0'; 
     c=getchar_unlocked(); 
    } 
    if(negative) 
     t=~(t-1); //negative 
    *i=t; 
} 

int main(int argc, char const *argv[]) 
{ 
    int i; 
    scan(&i); 
    return 0; 
} 

我知道這裏被定義爲scan功能快於scanf並且是編程競賽是非常有用的。但由於某些原因,此代碼不能在Windows上工作,並且正在使用Linux。我該怎麼做才能讓它在windows上運行。我正在使用dev-c++g++編譯器。

回答

3

getchar_unlocked不是C或C++標準函數,因此它不適用於Windows並不奇怪。我認爲這是POSIX標準,但Windows編譯器不支持所有的POSIX功能。

如果您將getchar_unlocked替換爲getchar,雖然該算法看起來不太正確,但它仍然有效。

你可以使用條件編譯做到這一點,像這樣例如

#ifdef _WINDOWS 
// no getchar_unlocked on Windows so just call getchar 
inline int getchar_unlocked() { return getchar(); } 
#endif 
+0

的是有辦法,我可以判斷是否getchar_unlocked''在定義目標系統? – prongs

+2

如果您知道在您定義的系統上可以使用條件編譯。但我不知道有任何完全自動的方式來做到這一點。 – john

+0

@prongs爲什麼你不試試,它爲spoj工作,我剛剛嘗試和getchar 0.04並解鎖了0.02,200%的改善。 –

0

Windows系統有相當於_getchar_nolock,是Windows具體。

請參閱此鏈接:

https://msdn.microsoft.com/en-us/library/4y2e9z0c.aspx

所以,如果你是幸福的一個非線程版本,並且希望儘可能最佳的性能,你可以做這樣的事情:

#ifdef WIN32 
// no getchar_unlocked on Windows so call _getchar_nolock 
inline int getchar_unlocked() { return _getchar_nolock(); } 
#endif 
0

getchar_unlocked()主要用於競爭性編程,但是,如果您想在其他地方使用,請確保一次只有一個線程正在使用它。 同樣適用於putchar_unlocked()函數。 這是一個POSIX等價物,所以Windows編譯器不支持它。 但是,您可以使用兩

1)正常速度

int getchar_unlocked() { return getchar(); } 
void putchar_unlocked(char _c) {return putchar(_c); } 

2)速度快

int getchar_unlocked() { return _getchar_nolock(); } 
void putchar_unlocked(char _c) { return _putchar_nolock(_c); }