C++ 创建排序算法,以c+;中的特定顺序在while循环中对多个字符串值进行排序+;

C++ 创建排序算法,以c+;中的特定顺序在while循环中对多个字符串值进行排序+;,c++,algorithm,sorting,C++,Algorithm,Sorting,我的任务是创建一个排序算法,该算法将接收某人的信息,并将其按一定顺序排序。数据列在文本文件中,如下所示 基本上,我必须先按一个条件排序,然后再按下一个条件排序,直到全部排序为止 目前,我已经创建了一个代码来读取这些行,并将每一位信息放入单独的字符串中。这就是我的问题开始的地方。现在我已经将它们全部分离出来进行排序,我需要找到一种方法来修改快速排序或其他排序算法,以根据第一个字符串开始排序,并根据它们进行调整,如果它们相同,则按第二个进行调整,依此类推。我对创建任何类型的排序算法都比较陌生,所以如

我的任务是创建一个排序算法,该算法将接收某人的信息,并将其按一定顺序排序。数据列在文本文件中,如下所示

基本上,我必须先按一个条件排序,然后再按下一个条件排序,直到全部排序为止

目前,我已经创建了一个代码来读取这些行,并将每一位信息放入单独的字符串中。这就是我的问题开始的地方。现在我已经将它们全部分离出来进行排序,我需要找到一种方法来修改快速排序或其他排序算法,以根据第一个字符串开始排序,并根据它们进行调整,如果它们相同,则按第二个进行调整,依此类推。我对创建任何类型的排序算法都比较陌生,所以如果有人能够帮助我朝着正确的方向开始,我将不胜感激。下面是我到目前为止所拥有的东西的副本

#include <Header.h>

int main()
{
int n;

string first;
string last;
string street;
string city;
string state;
string zip;

string line;

cout<<"Choose a file size\n 100 \n 200 \n 5000 \n 1000 \n";
cin>>n;
    if (n==100){
        ifstream input("address100.txt"); //Reads lines and pushes to citizens
        while (getline(input, line)){
        stringstream ss(line);
        getline(ss, first, '|');
        getline(ss, last, '|');
        getline(ss, street, '|');
        getline(ss, zip, '|');
        getline(ss, city, '|');
        getline(ss, state, '|');
        }
    }
    if (n==200){
        ifstream input("address200.txt"); //Reads lines and pushes to citizens
        while (getline(input, line)){
        stringstream ss(line);
        getline(ss, first, '|');
        getline(ss, last, '|');
        getline(ss, street, '|');
        getline(ss, zip, '|');
        getline(ss, city, '|');
        getline(ss, state, '|');
    }
    }
    if (n==1000){
        ifstream input("address1000.txt"); //Reads lines and pushes to citizens
        while (getline(input, line)){
        stringstream ss(line);
        getline(ss, first, '|');
        getline(ss, last, '|');
        getline(ss, street, '|');
        getline(ss, zip, '|');
        getline(ss, city, '|');
        getline(ss, state, '|');
    }
    }
    if (n==5000){
        ifstream input("address5000.txt"); //Reads lines and pushes to citizens
        while (getline(input, line)){
        stringstream ss(line);
        getline(ss, first, '|');
        getline(ss, last, '|');
        getline(ss, street, '|');
        getline(ss, zip, '|');
        getline(ss, city, '|');
        getline(ss, state, '|');
    }
    }
    return 0;
}
#包括
int main()
{
int n;
先串;
最后一串;
弦街;;
字符串城市;
字符串状态;
拉链;
弦线;
coutn;
如果(n==100){
ifstream输入(“address100.txt”);//读取行并推送到公民
while(getline(输入,行)){
弦流ss(线);
getline(ss,第一个“|”);
getline(ss,最后一个“|”);
getline(ss,街,|’);
getline(不锈钢,拉链,“|”);
getline(党卫军,城市,“|”);
getline(ss,州“|”);
}
}
如果(n==200){
ifstream输入(“address200.txt”);//读取行并推送到公民
while(getline(输入,行)){
弦流ss(线);
getline(ss,第一个“|”);
getline(ss,最后一个“|”);
getline(ss,街,|’);
getline(不锈钢,拉链,“|”);
getline(党卫军,城市,“|”);
getline(ss,州“|”);
}
}
如果(n==1000){
ifstream输入(“address1000.txt”);//读取行并推送到公民
while(getline(输入,行)){
弦流ss(线);
getline(ss,第一个“|”);
getline(ss,最后一个“|”);
getline(ss,街,|’);
getline(不锈钢,拉链,“|”);
getline(党卫军,城市,“|”);
getline(ss,州“|”);
}
}
如果(n==5000){
ifstream输入(“address5000.txt”);//读取行并推送到公民
while(getline(输入,行)){
弦流ss(线);
getline(ss,第一个“|”);
getline(ss,最后一个“|”);
getline(ss,街,|’);
getline(不锈钢,拉链,“|”);
getline(党卫军,城市,“|”);
getline(ss,州“|”);
}
}
返回0;
}

我的建议是使用
结构
对格式化数据建模。每个文本行将被称为记录

接下来,您应该重载
运算符>>
以读取记录:

struct Record  
{
  string first;
  string last;
  string street;
  string city;
  string state;
  string zip;
  friend std::istream& operator>>(std::istream& input, Record& r);
};
 
std::istream& operator>>(std::istream& input, Record& r)
{
    std::string line;
    getline(input, line);
    stringstream ss(line);
    getline(ss, r.first, '|');
    getline(ss, r.last, '|');
    getline(ss, r.street, '|');
    getline(ss, r.zip, '|');
    getline(ss, r.city, '|');
    getline(ss, r.state, '|');
    return input;
}  
您的输入代码可能如下所示:

std::vector<Record> database;
Record r;
while (input >> r)
{
    database.push_back(r);
}

我在你的问题中没有看到任何排序代码。为什么不直接使用
std::sort
?您应该从定义包含所有字段的结构开始,然后创建此类结构的容器。然后使用<代码> STD::排序< /COD>你是想把排序算法写为一个学习练习,还是只是尝试编写一些C++来完成你需要的排序。如果是后者,那么您可以/应该使用一种stl排序算法。然后,您需要编写一个比较函数来比较两条记录(如果第一个给定值应按排序顺序首先出现,则返回true)。如果您不喜欢
std::sort
,则可以使用
qsort()
函数。您正在读取数据,但不存储数据。我建议您使用字段声明一个
struct
,然后使用
std::vector
来包含记录。重载运算符<假定这是唯一(或至少是默认)的排序顺序。当然,这可能是正确的,但如果排序顺序特定于要排序的集合,则可以将2参数比较运算符与排序重载一起使用,该重载也将比较函数作为参数。@ROX它不假定这是唯一的排序顺序。它假定它是默认的排序顺序。
运算符的存在
std::vector<Record> database;
Record r;
while (input >> r)
{
    database.push_back(r);
}
struct Record
{
  // Same as above
  bool operator<(const Record& r) const;
};

bool Record::operator<(const Record& r) const
{
//zip, then city, street, first name, and finally last name.
  if (zip != r.zip) return zip < r.zip;
  else
  {
     if (city != r.city) return city < r.city;
     else
     {
        // Etc.
     }
  }
  return false;
}
std::sort(database.begin(), database.end());