次のように、文字列の最後の文字を取得するための省略形またはよりエレガントな方法があるかどうか疑問に思いました。
char lastChar = myString.at( myString.length() - 1 );
のようなものmyString.back()
は存在しないようです。同等のものはありますか?
回答:
C ++ 11以降では、back
メンバー関数を使用できます。
char ch = myStr.back();
C ++ 03ではstd::string::back
、見落としのため利用できませんが、reverse_iterator
次から戻ってきたものを逆参照することでこれを回避できますrbegin
。
char ch = *myStr.rbegin();
どちらの場合も、文字列に実際に少なくとも1文字が含まれていることを確認するように注意してください。そうしないと、未定義の動作が発生します。これは悪いことです。
お役に立てれば!
--std=c++11
、g ++を強制的にコンパイルする必要back()
がありました。
最初に文字列の長さを確認して、次のようなことを行うことをお勧めします。
if (!myStr.empty())
{
char lastChar = *myStr.rbegin();
}
*myStr.end()
と同じではありませんmyStr[myStr.size()]
!そして、たとえそうであったとしても、はとmyStr.rbegin()
同等myStr.end()-1
であり、空の文字列では明らかに無効です。
back
通常のコンテナのメンバー関数と、不足している文字列の機能を実装する通常の関数に委任する関数テンプレートを作成できます。
template <typename C>
typename C::reference back(C& container)
{
return container.back();
}
template <typename C>
typename C::const_reference back(const C& container)
{
return container.back();
}
char& back(std::string& str)
{
return *(str.end() - 1);
}
char back(const std::string& str)
{
return *(str.end() - 1);
}
そうすれば、文字列なのかベクトルなのback(foo)
かを気にせずに言うことができますfoo
。