2011-02-03 8 views
67

存在する。同等品はありますか? C++ 11ではSTDの最後の要素を取得する::文字列

+0

私はそれが必要ではないと思います。なぜなら、あなたは提供された機能でそれをかなり簡単に行うことができるからです。 –

+4

その引数はコンテナクラスに対しても保持されます。 – Deve

答えて

100

、あなたはbackメンバ関数を使用することができます:std::string::backが原因監督には使用できませんが、あなたはreverse_iteratorを逆参照することにより、この問題を回避することができ、C++ 03では

char ch = myStr.back(); 

をあなたはrbeginから返されます:

char ch = *myStr.rbegin(); 

これは役に立ちます。

+10

C++でback()関数が追加されました。 – eddi

+1

@ eddi-ありがとうございました!私はそれに応じて私の答えを更新しました。 – templatetypedef

+0

注: 'back()'が利用できるようにするには、g ++に '--std = C++ 11 'をコンパイルするように強制しなければなりませんでした。 – JulianHarty

2

*(myString.end() - 1)多分?それはまったくエレガントではありません。

python-esque myString.at(-1)は、すでに膨れ上がっているクラスをあまりにも多く求めています。

20

あなたはおそらく最初の文字列の長さをチェックして、このような何かをしたい:

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

長さを確認する必要はありません。空文字列の場合は、lastCharに格納された '\ 0'を取得するだけです。 –

+2

@ MarkLoeser:そうではありません。 '* myStr.end()'は 'myStr [myStr.size()]'と同じではありません!そして、たとえそれがあったとしても、 'myStr.rbegin()'は 'myStr.end() - 1'と同じです。これは空の文字列では無効です。 –

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); 
} 

次に、あなただけのfooが文字列かベクトルであるかどうかを気にせずback(foo)を言うことができます。

関連する問題