C++でatoiを置き換えることができる関数はありますか?私はいくつかの調査を行ったが、それを置き換えるものが見つからなかった、唯一の解決策はcstdlibを使用するか自分で実装することである
Boostを使用したくない場合は、C++ 11に std::stoi
文字列用。同様のメソッドがすべてのタイプに存在します。
std::string s = "123"
int num = std::stoi(s);
atoi
とは異なり、変換できない場合は invalid_argument
例外がスローされます。また、値がintの範囲外の場合、 out_of_range
例外がスローされます。
boost::lexical_cast
はあなたの友達です
#include <string>
#include <boost/lexical_cast.hpp>
int main()
{
std::string s = "123";
try
{
int i = boost::lexical_cast<int>(s); //i == 123
}
catch(const boost::bad_lexical_cast&)
{
//incorrect format
}
}
次のように、Boost関数boost :: lexical_cast <>を使用できます。
char* numericString = "911";
int num = boost::lexical_cast<int>( numericString );
詳細については、こちらをご覧ください こちら (最新のBoostバージョン1.47)。例外を適切に処理することを忘れないでください。
ブーストなし:stringstream ss(my_string_with_a_number); int my_res; ss >> my_res;
ブーストバージョンと同じくらい厄介ですが、追加の依存関係はありません。おそらくより多くのRAMを浪費する可能性があります。
atoi
が不適切である理由をあなたは言わないので、パフォーマンスに何らかの影響があると思います。とにかく、説明が役に立ちます。
Boost Spirit.Qiの使用は、少なくとも Alex Ottによるテスト では、atoi
よりも1桁高速です。
参照はありませんが、前回テストしたときはBoost lexical_cast
はatoi
よりも約1桁遅い。その理由は、非常に高価な文字列ストリームを構築するためだと思います。
更新: いくつかのより最近のテスト
関数 stoi();
を使用できます
#include <string>
// Need to include the <string> library to use stoi
int mani(){
std::string s = "10";
int n = stoi(s);
}
これを実際にコンパイルするには、c ++ 11を有効にする必要があります。それを行う方法をGoogleで検索してください(コード::ブロックの場合:設定->コンパイラ->「g ++にC++ 11 ISO C++言語標準に従ってください」)端末からコンパイルする場合は、-std = c ++ 11を追加する必要があります
g++ -std=c++11 -o program program.cpp