代入関数 ( の型に関係なくtemp
) には、同じ型の反復子が 2 つ必要です。逆反復子は、通常の反復子と同じ型を持ちません。base()
逆反復子の関数を使用して、基になる通常の反復子を取得できますが、注意してください。これは、逆反復子が指している位置の 1 つ後ろにあります。たとえば、次のように書くと
temp.assign( find( value.begin(), value.end(), '\"' ),
find( value.rbegin(), value.rend(), '\"').base() );
、末尾'"'
は結果の文字列の一部になります。
この特定の動作は、結果を最初のイテレータとして使用している場合に必要になることがよくあります。
std::string( std::find( fn.rbegin(), fn.rend(), '.' ), fn.end() )
たとえば、最後の の
後'.'
のすべてのテキストが表示されます。検索の結果を逆反復子を終了基準として使用する場合、通常は変数に保存し、何らかの方法で「修正」する必要があります。
最後に、上記のように、範囲を定義するために 2 つの検索結果を使用する場合は、非常に注意する必要があります。たとえば、テキストにno がない場合'"'
は、次のようになります。
temp.assign( value.end(), value.begin() );
、これはうまくいきません。
編集:
例として、文字が必要ない場合は'"'
、次のようにするとうまくいくと思います。
// Returns an empty string if there are not two " chars.
std::string
extractQuoted( std::string const& original )
{
// end points to one after the last '"', or begin() if no '"'.
std::string::const_iterator end
= std::find( original.rbegin(), original.rend(), '"' ).base();
if ( end != original.begin() ) {
-- end; // Since we don't want the '"' in the final string
}
return std::string( std::find( original.begin(), end, '"' ), end );
}
(それは私の頭の上から外れているので、保証はできませんが、正しい方向に始めることができるはずです。)