2011-11-22 41 views
5

文字列から64ビット符号なし整数unsigned long longを読み込む問題を扱っています。 Read 64 bit integer string from filestrtoullは仕事がうまく、より効率的std::stringstreamを使用するよりも作るだろうとthougth:私のコードは、私はこの質問と、そのトピックの答えを読んでGCC 4.3とVisual Studio 201064bit整数から文字列への変換

の両方を動作するはずです。残念ながらstrtoullはVisual Studioのstdlib.hでは使用できません。

は、だから私は短いテンプレート機能書きました:私は、このソリューションの効率心配

template <typename T> 
T ToNumber(const std::string& Str) 
{ 
    T Number; 
    std::stringstream S(Str); 
    S >> Number; 
    return Number; 
} 

unsigned long long N = ToNumber<unsigned long long>("123456789"); 

を、このescenarioでより良いオプションはありますか?

+1

あなたのアプリのホットスポットですか? –

+0

@Violet:実際はそうではありませんが、GUIをリフレッシュするために大容量のファイルが定期的にロードされるため、できるだけスムーズに実行してください。 –

+1

あなた自身の変換を書くことができます。 'stringstream'を使うよりも速いでしょう。ここのベンチマークを参照してください:http://tinodidriksen.com/2010/02/16/cpp-convert-string-to-int-speed/ – Pablo

答えて

4

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/d69a6afe-6558-4913-afb0-616f00805229/

を参照してください ")それは(_strtoui64と呼ばれる、_wcstoui64()と_tcstoui64()。プラスカスタムロケールの_lバージョン。
ハンスアンパッサン。"

ところで、このようなGoogleのやり方は、Googleが自動的にあなたが間違っていると思うことに気づくことです(新しいバージョンのVisual Studioと同じように)。代わりに別のものを検索します。検索のためにあなたが言ったものを検索するためのリンク。

乾杯& HTH。、

+0

@anonymous downvoter:あなたのdownvoteを説明してください。他の人がなぜそれが愚かで無視されているかを知ることができますそれ。 –

2

もちろん、単純な10進文字列を扱うための独自の関数を簡単に書くことができます。標準関数は、数値ベースとロケールに従ってさまざまな選択肢を扱いますが、いずれの場合もそれらを遅くします。

はい、stringstreamは、すべての上にヒープ割り当てを追加します。いいえ、パフォーマンスは実際には違いが分かるまで問題ではありません。

バッファを所有しない(したがって、コピーを作成しない、または割り当てを実行しない)推奨されないstd::strstreamクラスを使用する方が高速なオプションがあります。私はそれを "より良い"と呼んでいません。

1

あなたは文字列を解析でき、後方から始まり、1 000 000 000^I、すなわち(最後の8桁* 1)+(次の8桁の数字を掛ける時に9桁の数字* 10億)...または

(1000000000000000000)+(234567890000000000)+(123456789) 
+0

'strtoul'への複数の呼び出しを1つの' strtoull'に結合することを意味するならば、それは非小数の基数では機能しません。彼は単に 'number = number * 10 + character - '0' 'でループする方が良いでしょう。 – Potatoswatter

関連する問題