对字符串数组进行排序
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 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。特别是,“不起作用”不是对问题的描述。显示给定的输入和输出。 他妈的全能。有什么理由不简单地使用qsort
或std::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::string
、std::vector
(以及 C++ 库中的其他容器)会跟踪它们的大小,并在需要时干净利落地调整自己的大小。
阅读std::string
和std::vector
,了解您需要做什么来管理它们(设置内容、更新等)。
【讨论】:
正如我在下面对大卫阿尔瓦雷斯所说的,不幸的是,即使我不知道 sort() 是做什么的,我想它更快更容易,但由于这段代码是为了考试我昨天,这解释了为什么,例如,我使用!运算符对数组进行排序,我必须以特定方式进行操作【参考方案2】:您没有将任何内容复制到临时指针。
改变
strcpy(vett[i].nome,temp);
到
strcpy(temp, vett[i].nome);
另外,我只想说您使用的方法效率极低并且可能会导致问题。我会为你的类定义一个比较函数并使用 std::sort()。并且请下次提供更多信息,输入和预期输出的输出,它会有所帮助。
【讨论】:
不幸的是,尽管我不知道 sort() 是做什么的,但我想它更快更容易,但由于这段代码是为了我昨天的考试,这就解释了为什么,因为例如,我使用 !运算符对数组进行排序,我必须以特定方式进行。以上是关于对字符串数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章