1

私が C++ で試していたちょっとしたことについては、文字列 ('a tomato is red' など) を受け入れて、スペースを取り除きました ('atomatoisred')。

その文字の最初のインスタンスが残るという条件で、繰り返し登場する文字のみを削除するにはどうすればよいでしょうか (つまり、この例では「atomisred」になります)。

前もって感謝します!

4

2 に答える 2

7

重複した文字を追跡するセットと組み合わせて、消去削除イディオムを使用できます。

std::set<char> dupes;

str.erase(
    std::remove_if(
        str.begin(), str.end(),
        [&](char c) { return not dupes.insert(c).second; }),
    str.end());

std::set::insertこれは、 の戻り値がペアであり、その 2 番目の要素がbool挿入が行われたかどうかを示すという事実も利用しています。

于 2012-10-01T13:05:36.707 に答える
0

自分で (なしで )実装したい場合stlは、いくつかの方法があります。

  1. 並べ替えを通して。これは、文字の順序を気にしない場合に機能します。最初に文字列を並べ替えてから、すべての要素に対して非常に簡単なチェックを実行します。

    if( currentElement == elemebtBeforeIt )
        deleteCurrentElement
    
  2. もう 1 つの方法は、一意の文字専用の配列を用意することです (配列ではないかもしれませんが、アイデアは得られます)。文字列を調べて、各文字について次を確認します。

    foreach Element of the string:
        if( arrayOfUniqueElements contains currentElement ) 
            do nothing
        else
            put currentElement into the arrayOfUniquElements
    

    この後、専用配列にすべての一意の要素が含まれます。

于 2012-10-01T13:09:31.630 に答える