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

编辑我刚刚看到这是家庭作业。无论如何,一旦你完成了,这是一种惯用的 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 回答
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 回答
1

如果您的排序工作正常,那么您不需要遍历两者ij比较字符串。您只需要遍历一个索引并与下一个字符串进行比较。然后,如果它们相等,则删除下一个字符串,如果它们不同,则仅增加索引。

下面是一些伪代码:

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 回答
0

您在循环体中修改了 n 循环上限,这可能是您的问题的原因,

所以删除线

 m--;

并在另一个变量中跟踪剩余的字符串数量当您编写一个保持停止条件稳定的循环时,这是一种常见的好习惯。

于 2013-07-01T20:25:22.423 回答
0

这应该工作!

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-1); k++){
                scadena[k]=scadena[k+1];
            }
        }
    }
} 
于 2013-07-01T20:28:14.173 回答