5

文字列から64 ビットの符号なし整数を読み取る問題に取り組んでunsigned long longいます。私のコードは、GCC 4.3 と Visual Studio 2010 の両方で動作するはずです。

私はトピックに関するこの質問と回答を読みました:ファイルから64ビット整数文字列を読み取りstrtoullstd::stringstream. 残念ながら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>("1234567890123456789");

このソリューションの効率が心配なので、このシナリオでより良いオプションはありますか?

4

3 に答える 3

5

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/d69a6afe-6558-4913-afb0-616f00805229/を参照してください。

「これは _strtoui64()、_wcstoui64()、および _tcstoui64() と呼ばれます。さらに、カスタム ロケール用の _l バージョン
。Hans Passant.」

ところで、このような Google への道は、Google が自動的にあなたが間違っていると判断し (Visual Studio の新しいバージョンのように)、代わりに別のものを検索することに注意することです。そのため、リンクをクリックして何を検索するかを確認してください。あなたはそれを検索するように言いました。

于 2011-11-22T08:25:38.420 に答える
2

もちろん、単純な 10 進文字列を処理する独自の関数を簡単に作成できます。標準関数は、数値ベースとロケールに応じてさまざまな選択肢を処理するため、いずれにしても遅くなります。

はい、stringstreamその上にヒープ割り当てを追加します。いいえ、違いがわからない限り、パフォーマンスは問題ではありません。

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

于 2011-11-22T08:24:19.040 に答える
1

文字列を後方から 9 桁ずつ解析し、1 000 000 000 ^ i を掛けます。つまり、(最後の 8 桁 * 1) + (次の 8 桁 * 10 億) ... または

(1000000000000000000)+(234567890000000000)+(123456789)
于 2011-11-22T08:38:22.977 に答える