对字符串数组进行排序

Posted

技术标签:

【中文标题】对字符串数组进行排序【英文标题】:Sort an array of strings 【发布时间】:2016-01-13 00:49:35 【问题描述】:

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

#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();
;

即一个数组,其中每个元素都是一个字符串和一个布尔值,但是最后一个现在不重要了。

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

这是我尝试的方法。

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 是否为真,否则不会执行。然后它开始排序。 这就是我尝试这样做的方式,但它不起作用。

附:解决方案必须使用辅助指针,例如: aux=i; i=j; j=aux;

【问题讨论】:

欢迎来到 ***。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。特别是,“不起作用”不是对问题的描述。显示给定的输入和输出。 他妈的全能。有什么理由不简单地使用qsortstd::sort?您将其中任何一个传递给您喜欢的任何一个数组,并提供一个比较函数。 (您的比较函数本质上是单行的。) 我知道你们所有人都认为我应该使用它,事情是,这整件事就是我昨天的 C++ 考试,这就是我使用 !运算符对数组进行排序,因为有人要求我这样做。现在我必须更正那些我无法实现的功能。 【参考方案1】:

快速提示。

    不要使用operator!() 进行排序。使用类似sort() 的函数。 operator!() 通常会做非常不同的事情,使用它进行排序会使您的代码更难理解。 不要在头文件中使用using namespace std(或在依赖它的类定义之前)。网上有很多解释。 使用标准 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,了解您需要做什么来管理它们(设置内容、更新等)。

【讨论】:

正如我在下面对大卫阿尔瓦雷斯所说的,不幸的是,即使我不知道 sort() 是做什么的,我想它更快更容易,但由于这段代码是为了考试我昨天,这解释了为什么,例如,我使用!运算符对数组进行排序,我必须以特定方式进行操作【参考方案2】:

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

改变

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

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

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

【讨论】:

不幸的是,尽管我不知道 sort() 是做什么的,但我想它更快更容易,但由于这段代码是为了我昨天的考试,这就解释了为什么,因为例如,我使用 !运算符对数组进行排序,我必须以特定方式进行。

以上是关于对字符串数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

对包含数字和字符串的数组进行排序

Elasticsearch:使用处理器对数组进行排序

Elasticsearch:使用处理器对数组进行排序

php怎么对数组进行排序

对其中包含字符串的数组进行排序

按字母顺序对 c 字符串数组进行排序