web-dev-qa-db-ja.com

std :: atoi()とstd :: stoiの違いは何ですか?

atoistoiの違いは何ですか?

知っている、

std::string my_string = "123456789";

その文字列を整数に変換するには、次のことを行う必要があります。

const char* my_c_string = my_string.c_str(); 
int my_integer = atoi(my_c_string);

C++ 11は簡潔な置換を提供します:

std::string my_string = "123456789"; 
int my_integer = std::stoi(my_string);

1)。 2つの間に他の違いはありますか?

2)。効率とパフォーマンスのどちらが良いですか?

3)。どちらを使用する方が安全ですか?

42
Bhupesh Pant

1)。 2つの間に他の違いはありますか?

std::atoi()は恐ろしい関数です。エラー時にゼロを返します。ゼロを有効な入力と見なすと、変換中にエラーが発生したか、入力がゼロであったかを判断できません。それはただ悪いです。たとえば、 c関数atoiが失敗したか、ゼロの文字列であったかをどのように確認しますか?

一方、対応するC++関数はエラー時に例外をスローします。入力としてゼロからエラーを適切に区別できます。

2)。効率とパフォーマンスのどちらが良いですか?

正確さを気にしない場合、または入力としてゼロがないことを確信している場合、またはとにかくエラーを考慮する場合は、おそらくC関数mightより高速になります(おそらく、例外処理が不足しているためです)。コンパイラ、標準ライブラリの実装、ハードウェア、入力などに依存します。最良の方法はそれを測定することです。ただし、違いがあるとしても、無視できる程度だと思います。

高速な(しかしいCスタイルの)実装が必要な場合、- 最も賛成の答えC++で文字列をintに解析する方法 の質問は妥当と思われます。ただし、どうしても必要な場合を除いて、その実装には行きません(主にchar*および\0終了)。

3)。どちらを使用する方が安全ですか?

最初のポイントを参照してください。

それに加えて、char*および\0終了、あなたは間違いを犯しやすい。 std::stringは、これらすべてを処理するため、作業がはるかに簡単で安全です。

50
Ali