2013-02-05 8 views
5

私は学校でstring::atを教えられましたが、文字列ライブラリーを調べると、私は前に一度も見たことがないstring::operator[]を見ました。string :: atとstring :: operator []の違いは何ですか?

私は現在operator[]を使用していますので、atは使用していませんが、違いは何ですか?彼らは基本的に、出力の点では同じですが、私は認識していないよ、いくつかの微妙な違いがあります

std::string foo = "my redundant string has some text"; 
std::cout << foo[5]; 
std::cout << foo.at(5); 

: ここではいくつかのサンプルコードですか?

+3

あなたはそれぞれの参照をしようとしましたを参照してください?違いがありますが、これは参照を比較する際にはかなり簡単に見つかるはずです。 – chris

+1

あなたは本やオンラインリファレンスを調べる前に '.at()'から 'operator []' *に切り替えることにしましたか? – us2012

+0

まあ、私は演算子[]を読むことが速かったが、理由を知らなかった... –

答えて

15

はい、一つの大きな違いがあります:.at()を使用すると、インデックスの範囲チェックに合格しないとoperator[]はちょうどそのような状況で未定義の動作をもたらしながら、それは、文字列の端の上だ場合は例外をスローします。

10

at境界チェックはですが、無効なアクセスではstd::out_of_rangeの例外があります。

operator[]境界をチェックしないと、は文字列の境界を超えてアクセスしようとすると危険です。しかし、それはatより少し速いです。

4

のstd ::文字列::

では、指定された場所posに文字への参照を返します。境界チェックが実行されますが、無効なアクセスでstd :: out_of_range型の例外がスローされます。

文字列::演算子[]

は、指定された場所posに文字への参照を返します。境界チェックは実行されません。 operator[]で境界外にアクセスすることは、定義されていない動作です。

string::operator[]はsilghtly速くstd::string::at

よりべきであるreference

関連する問題