2011-07-07 17 views
9

std::atollからcstdlibまでは、文字列をgccでint64_tに変換しています。この機能はWindowsツールチェーン(Visual Studio Express 2010を使用)では使用できないようです。何が最良の選択肢ですか?std :: atoll with VC++

stringsからuint64_tへの変換にも興味があります。整数定義はcstdintから取られました。

+0

この問題はVS2013で修正されているようですhttp://connect.microsoft.com/VisualStudio/feedback/details/752386/std-atoll-not-found – javapowered

答えて

8

MSVCは_atoi64と同様の機能を持って、符号なしの64ビットタイプではhere

を参照してください、_strtoui64

+0

乾杯、ありがとう。 – Cookie

+0

他の人のために、これはuint64_tと同等ではないようですが、私はint64_t(第三者のライブラリからキャスト)に切り替えました – Cookie

+0

@Cookie、符号なし64ビットタイプ – nos

5
  • 使用stringstreams(<sstream>

    std::string numStr = "12344444423223"; 
    std::istringstream iss(numStr); 
    long long num; 
    iss>>num; 
    
  • 利用ブーストのlexical_cast(boost/lexical_cast.hpp

    std::string numStr = "12344444423223"; 
    long long num = boost::lexical_cast<long long>(numStr); 
    
+0

パフォーマンス上の理由からむしろ私はむしろ – Cookie

+5

@Cookie:あなたパフォーマンステストを実行し、文字列を数値に変換することがボトルネックであることが判明しましたか? –

+0

valgrindは私にそれを教えています。 strtodは合計時間の8%です。 atolは少し遅れて4%です。私は実際にそれらの8%を取り除くためにstrtodを書き換えています。ストリングストリームはatolよりかなり遅いです。 lexical_castが最も遅いです。ほとんどの場合、100メガcsvの解析に費やされます。 – Cookie

2

あなたは、パフォーマンス・テストを実行すると、変換があなたであると結論している場合ボトルネックがあり、本当に速く実行する必要があります。準備機能はありません。あなたは自分で書く。 ここでは、本当に高速でエラーチェックがなく、正の数しか扱わないサンプルがあります。

long long convert(const char* s) 
{ 
    long long ret = 0; 
    while(s != NULL) 
    { 
     ret*=10; //you can get perverted and write ret = (ret << 3) + (ret << 1) 
     ret += *s++ - '0'; 
    } 
    return ret; 
} 
+0

Armen、ありがとう。これは、ダブルスのためのhttp://stackoverflow.com/questions/5830868/c-stringstream-is-too-slow-how-to-speed-upに非常によく似ています。 – Cookie

1

<cstdlib>にはstrtoullがありますか?それはC99です。また、C++ 0xの文字列には直接stoullが必要です。

+0

悲しいことに、MSVCはC99をサポートしていません。 – nos

1

のVisual Studio 2013が最終的にstd::atollを持って参照してください。

関連する問題