0

順方向イテレータと逆方向イテレータを混在させているため、以下はコンパイルされないと思います。なぜ私はそれらをこのように混ぜることができないのですか?どうすれば動作させることができますか? 文字列の最初と最後の引用符を削除したいのですが、内部の引用符はそのままにしておきます。

temp.assign(find(value.begin(), value.end(), '\"'), find(value.rbegin(), value.rend(), '\"'));

私はこれを行うことさえできません。逆イテレータのポイントは何ですか?

value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"'));
4

5 に答える 5

3

代入関数 ( の型に関係なく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 );
}

(それは私の頭の上から外れているので、保証はできませんが、正しい方向に始めることができるはずです。)

于 2013-04-10T18:23:39.907 に答える
1

reverse_itertators を使用する場合は、基礎となる反復子型に対して .base() を呼び出します。例えば

value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"').base());

トリックを行うかもしれません。

于 2013-04-10T18:22:40.367 に答える