std :: stringの最後の要素を取得します


87

次のように、文字列の最後の文字を取得するための省略形またはよりエレガントな方法があるかどうか疑問に思いました。

char lastChar = myString.at( myString.length() - 1 );

のようなものmyString.back()は存在しないようです。同等のものはありますか?


提供されている機能で簡単にできるので、必要ないと思います。
–HoàngLong 2011

4
その議論はコンテナクラスにも当てはまります。
2011

回答:


129

C ++ 11以降では、backメンバー関数を使用できます。

char ch = myStr.back();

C ++ 03ではstd::string::back、見落としのため利用できませんが、reverse_iterator次から戻ってきたものを逆参照することでこれを回避できますrbegin

char ch = *myStr.rbegin();

どちらの場合も、文字列に実際に少なくとも1文字が含まれていることを確認するように注意してください。そうしないと、未定義の動作が発生します。これは悪いことです。

お役に立てれば!


13
back()関数がC ++ 11に追加されました
eddi 2013年

1
@ eddi-それを指摘してくれてありがとう!それに応じて回答を更新しました。
templatetypedef

注:使用できるようにするには--std=c++11、g ++を強制的にコンパイルする必要back()がありました。
JulianHarty 2017

@JulianHartyこれはほとんどのC ++ 11機能に当てはまると思います。:-)
templatetypedef

22

最初に文字列の長さを確認して、次のようなことを行うことをお勧めします。

if (!myStr.empty())
{
    char lastChar = *myStr.rbegin();
}

2
長さを確認する必要はありません。空の文字列の場合は、lastCharに「\ 0」が格納されます。
Mark Loeser

4
@MarkLoeser:それは真実ではありません。*myStr.end()と同じではありませんmyStr[myStr.size()]!そして、たとえそうであったとしても、はとmyStr.rbegin()同等myStr.end()-1であり、空の文字列では明らかに無効です。
軌道上でのライトネスレース2015年

7

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


2

*(myString.end() - 1)多分?それも正確にはエレガントではありません。

Python風myString.at(-1)は、すでに肥大化したクラスを要求しすぎます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.