【问题标题】:sort array of strings with a function使用函数对字符串数组进行排序
【发布时间】:2013-06-29 01:43:48
【问题描述】:

我打算使用以下代码对字符串数组进行排序:

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;
    }   
}

输出有重复的元素,但我不知道为什么。

完整的代码有一个对字符串进行排列的函数。

我不知道发生了什么。

【问题讨论】:

标签: c++ arrays string algorithm sorting


【解决方案1】:

主要问题是当你从数组中删除一个元素时,你不应该增加 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--;
        }
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      下面是一些伪代码:

      int i=0;
      while(i+1<m)
        {
          if(scadena[i]==scadena[i+1])
            {
               // Delete scadena[i+1]
               .......
               m--;
            }
          else
            i++;
        }
      

      【讨论】:

        【解决方案4】:

        这应该可行!

        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];
                    }
                }
            }
        } 
        

        【讨论】:

          【解决方案5】:

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

          所以删除该行

           m--;
          

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

          【讨论】:

          • 我不明白你的想法
          猜你喜欢
          • 1970-01-01
          • 2013-10-23
          • 1970-01-01
          • 1970-01-01
          • 2016-07-18
          • 2015-01-16
          相关资源
          最近更新 更多