1

私はこのコードで文字列の配列をソートしようとしています:

void sort(string scadena[]){
    string temp;

    //here i am intenting sort the elements. it works fine

    for(int i=0;i<m;i++){
        for(int j=i+1;j<m;j++){
            if(scadena[i]>scadena[j]){
                temp=scadena[i];
                scadena[i]=scadena[j];
                scadena[j]=temp;    
            }           
        }
    }

    // Here i am intenting remove the repeated elements, but it not works fine.
    for(int i=0;i<m;i++){
        for(int j=0;j<m;j++){
            if(scadena[i]==scadena[j] && j!=i){
                for(int k=j;k <m; k++){
                    scadena[k]=scadena[k+1];
                }
                m--;
            }
        }
    }   

    //Because when i do the cout, the output has repeated elements. it not works
    for(int i=0;i<m;i++){
        cout<<i<<") "<<scadena[i]<<endl;
    }   
}

出力には要素が繰り返されていますが、その理由はわかりません。

完全なコードには、文字列の置換を行う関数があります。

私は何が起こるかしません。

4

5 に答える 5

3

主な問題は、配列から要素を削除するときに、現在のインデックスの文字列が変更されるため、j インデックスをインクリメントしてはならないことです。そのため、もう一度確認する必要があります。

m をデクリメントすると同時に j をデクリメントすることで、これを修正できます。

また、削除ループで配列の最後をオーバーランしているようです。

for(int k=j;k <m; k++){
    scadena[k]=scadena[k+1];
}

k が最後の反復に到達すると (つまり、k = m-1)、最後を過ぎた位置 m からコピーされることに注意してください。

両方の修正を含む更新されたループは次のようになります。

for(int i=0;i<m;i++){
    for(int j=0;j<m;j++){
        if(scadena[i]==scadena[j] && j!=i){
            for(int k=j;k+1 <m; k++){
                scadena[k]=scadena[k+1];
            }
            m--;
            j--;
        }
    }
}
于 2013-07-01T20:27:45.287 に答える
3

編集これは宿題用です。とにかく、それが終わったら、文字列のベクトルをソートし、重複を削除する慣用的な C++ の方法を次に示します。

#include <algorithm> // for sort and unique
#include <vector>
#include <string>

....

std::vector<std::string> strings = ....;
std::sort(std::begin(strings), std::end(strings));
auto it = std::unique(std::begin(strings), std::end(strings));
strings.erase(it, std::end(strings);
于 2013-07-01T20:26:23.413 に答える
1

並べ替えが正しく機能する場合は、両方をループして文字列を比較する必要はありませij。1 つのインデックスをループして、次の文字列と比較するだけです。次に、等しい場合は次の文字列を削除し、異なる場合はインデックスのみをインクリメントします。

ここにいくつかの擬似コードがあります:

int i=0;
while(i+1<m)
  {
    if(scadena[i]==scadena[i+1])
      {
         // Delete scadena[i+1]
         .......
         m--;
      }
    else
      i++;
  }
于 2013-07-02T00:37:08.527 に答える