2011-08-13 84 views
5

我正在構建我的第一個C++應用程序並選擇一個有效的C++庫在此階段依賴的過程中,是我正在考慮的設計考慮因素之一。哪個效率高,itoa或sprintf?

因此,我想將整數類型轉換爲字符串並決定是否使用;

sprintf(string, "%d", x); 

或者

整型ASCI

itoa(x, string); 

任何人都可以提出這些途徑之一是有效的,可能是爲什麼呢?

謝謝。

+5

什麼是'istringstream'或'boost :: lexical_cast'?畢竟它是C++。 – pmr

+3

整數格式是否真的會成爲應用程序的瓶頸? –

+1

@Kerrek SB在這個階段每一個小數。 – Bitmap

回答

10

請勿使用其中之一。使用std::stringstream等。

std::stringstream ss; 
ss << x; 
ss.str(); // Access the std::string 

無論採用哪種方式,轉換爲字符串都不太可能成爲應用程序執行時間的重要組成部分。

+0

Downvoter:關心評論? –

+0

這不是我,但我猜投票可能是因爲這個答案沒有回答原來的問題。 – legends2k

+1

'stringstream'非常慢,這可能是一些應用程序(例如HFT交易中)的重要組成部分,也不允許轉換爲現有的char *緩衝區。 – javapowered

14

它們都是有效的。可能更重要的是要注意itoa()不是C++標準的一部分,因此在許多常見的運行時中都不可用。 (特別是,它不是libstdc++的一部分,所以它在Mac OS X或Linux上不可用。)

0

從純算法的角度來看,可以認爲itoa會更快,因爲sprintf有額外的成本來解析格式描述符字符串。然而,如果沒有在實施中對兩個函數的成本進行基準測試,而且工作負載不重要,則無法確定。

此外,這不是蘋果比較蘋果,因爲這兩個功能都不相同。 sprintf可以做比itoa更多的格式化,除了前者是標準功能而後者不是。

旁白:如果你可以使用C++ 11可以使用to_string返回你的std::string。如果你想要十進制以外的表示,你可以這樣做:

int i = 1234; 
std::stringstream ss; 
ss << std::hex << i;  // hexadecimal 
ss << std::oct << i;  // octal 
ss << std::dec << i;  // decimal 

std::bitset<sizeof(int) * std::numeric_limits<unsigned char>::digits> b(i); 
ss << b;     // binary 

std::string str = ss.str(); 
相關問題