2016-01-13 209 views
1

我需要对此函数进行快速提示。所以基本上我有这个结构,由一个类使用。对字符串数组进行排序

#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,但最后一个现在并不重要。

这个!运算符必须按字母顺序对数组进行排序。

下面是我试图做到这一点。

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行检查,如果该数组的每个元素的每个布尔为真,否则将不会执行。然后它开始排序。 这就是我试图做到这一点,但它不起作用。

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

+1

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。在您发布代码并准确描述问题之前,我们无法有效帮助您。 特别是,“不起作用”不是对问题的描述。显示给定的输入和输出。 – Prune

+1

gawd almighty。任何不使用'qsort'或'std :: sort'的理由?您可以将其中任何一个传递给您喜欢的任何数组,并提供比较功能。 (你的比较函数本质上是一行代码。) – enhzflep

+0

我知道你们所有人都认为我应该使用它,事实是,这整个事情都是我昨天的C++考试,这就是为什么我使用!运算符来排序数组,因为它被要求我这样做。现在我必须纠正任何我无法实现的功能。 – user5753059

回答

0

您不会将任何内容复制到临时指针。

变化

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

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

而且,我只想说,你正在使用的方法极其低效而且容易造成问题。我会为你的类定义一个比较函数,并使用std :: sort()。而且,请下次提供更多信息,输入和输出与预期的输出一样,它有帮助。

+0

不幸的是,即使我不知道什么类型(),我想它会更快更容易,但是因为这个代码是用于昨天的考试的,所以这就解释了为什么,例如,我使用!运算符来对数组进行排序,并且我必须以特定的方式来完成。 – user5753059

1

快速提示。

  1. 请勿使用operator!()进行排序。使用一个名为sort()的函数。 operator!()通常做一个非常不同的事情,并用它来排序会让你的代码更难理解。
  2. 请勿在头文件中使用using namespace std(或在依赖它的类定义之前)。有很多关于为什么在互联网上的解释。
  3. 使用标准的C++库功能,而不是像现在这样滚动自己的功能。

例如,下面省略了构造函数之类的东西,但确实找到了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以了解您需要如何管理它们(设置内容,更新等)。

+0

正如我在下面向大卫·阿尔瓦雷斯所说的那样,不幸的是,即使我不知道什么是排序(),但我认为它更快更简单,但由于此代码是为我昨天的考试做出的,所以这解释了为什么,例如,我使用!运算符来对数组进行排序,并且我必须以特定的方式来完成 – user5753059

相关问题