2016-01-13 316 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

相關問題