排序字符串数组

时间:2016-01-13 00:49:35

标签: c++ arrays string sorting

我需要快速提示这个功能。 所以基本上我有这个结构,由一个类使用。

#include <cstring>
#include <iostream>
using namespace std;

struct postazione{
    char* nome;
    bool occupato;
};

class Aula{
    int qntpst;
    postazione * vett;
    bool full(const Aula&);
public:
    Aula(int);
    bool aggiungi(const char*);
    friend ostream& operator<<(ostream&, const Aula&);
    Aula& elimina(int);
    Aula(const Aula&); 
    Aula& operator!();
    ~Aula();
};

也就是说,每个元素都是一个字符串和一个bool的数组,但最后一个元素现在并不重要。

! operator必须按字母顺序对数组进行排序。

这是我尝试做的方式。

Aula& Aula::operator!(){
    int qnt=0;
    for(int i=0;i<qntpst;i++)
            if(vett[i].occupato)
                    qnt++;
    if(qnt!=qntpst)
            return *this;
    char *temp;
    for(int i=0;i<qntpst-1;i++){
            for(int j=i+1;j<qntpst;j++){
                    if(strcmp(vett[i].nome,vett[j].nome)>0){
                            temp=new char[strlen(vett[i].nome)+1];
                            strcpy(vett[i].nome,temp);
                            delete [] vett[i].nome;
                            vett[i].nome=new char[strlen(vett[j].nome)+1];
                            strcpy(vett[i].nome,vett[j].nome);
                            delete [] vett[j].nome;
                            vett[j].nome=new char[strlen(temp)+1];
                            strcpy(vett[j].nome,temp);
                            delete temp;
                    }
            }
    }
    return *this;
}

前7行检查数组中每个元素的每个bool是否为真,否则不会执行。然后它开始排序。 这就是我尝试做的方式,但它没有用。

P.S。解决方案必须使用辅助指针,如:      aux=i; i=j; j=aux;

2 个答案:

答案 0 :(得分:1)

快速提示。

  1. 请勿使用operator!()进行排序。使用名为sort()的函数。 operator!()通常会做一个非常不同的事情,使用它进行排序会使您的代码更难理解。
  2. 不要在头文件中使用using namespace std(或者在依赖它的类定义之前)。关于为什么在互联网上有很多解释。
  3. 使用标准C ++库功能,而不是像您一样自己滚动。
  4. 例如,以下内容省略了构造函数等,但确实占了你所寻求的90%。不用担心内存管理,让算法排序等等。

    #include <string>
    #include <vector>
    #include <algorithm>
    
    struct postazione
    {
        std::string nome;
        bool occupato;
        bool operator<(const postazione & other) const
          {
               return nome < other.nome;   // std::string supports this
          };
    };
    
    
    class Aula
    {
           std::vector<postazione> data;
       public:
          // constructors, destructors, etc
    
           void sort()    // sort the current vector
           {
                std::sort(data.begin(), data.end());  // this sorts using the order defined by postazione::operator<()
           }         
    
           Aula Sorted() const  // return a sorted copy of ourselves
           {
               Aula temp(*this);    // copy ourself
               temp.sort();         // sort the copy
               return temp;         //  return sorted copy
           };
    };
    

    要意识到的是std::stringstd::vector(以及C ++库中的其他容器)会跟踪它们的大小,并在需要时干净地调整自己的大小。

    阅读std::stringstd::vector,了解管理它们需要做些什么(设置内容,更新等)。

答案 1 :(得分:0)

您没有将任何内容复制到临时指针。

更改

strcpy(vett[i].nome,temp);

strcpy(temp, vett[i].nome);

另外,我要说的是,您使用的方法效率极低,可能会导致问题。我会为你的类定义一个比较函数,并使用std :: sort()。并且,请在下次提供更多信息,输入和输出与预期输出,它有帮助。