如何从最老的人到最年轻的人对此计划中的员工数据进行排序? C ++

时间:2014-04-20 21:48:34

标签: c++ arrays sorting

这里我有一个程序,它将员工数据文件读入一个结构数组。我有一个功能,搜索数组并找到最老的人并打印出该人的数据。但是现在我需要修改一个通过数组排序的函数,并将最旧的人数据移动到数组中的第一个位置,将第二个最旧的数据移动到第二个位置,依此类推,并对所有1000个员工执行相同操作,以便它将排序然后打印从最旧到最年轻的所有员工数据。我怎么能这样做?

以下是提供布局概念的前几行数据(出生日期为YYYYMMDD

114680858 19670607 Matilda Vincent MI

114930037 19471024 Desdemona Hanover ID

115550206 19790110 Xanadu Perlman ND

116520629 19630921 Alexander Hall SD



struct employees // employee data
{
int ss_number;//social security
int dob;//date of birth YYYY/MM/DD Ex.) 19870314=1987/03/14
string f_name;
string l_name;
string state; //state of residence 
};


void read_file()//read file into array of 1000 structs
{
ifstream data("/home/www/class/een118/labs/database1.txt");
employees array[1000]
if(!data.fail())
{
int i;
for(int i=0;i<1000;i++)
{
data>>array[i].ss_number
>>array[i].dob
>>array[i].f_name
>>array[i].l_name
>>array[i].state;
}
for(int i=0;i<1000;i++)
{
cout<<array[i].ss_number>>" "<<array[i].dob>>" "<<array[i].f_name>>" "<<
array[i].l_name>>" "<<array[i].state;
}}}


void print_person(employees e)
{
cout<<e.ss_number>>" "<<e.dob>>" "<<e.f_name>>" "<<e.l_name>>" "<<e.state;
}


void find_oldest(employees array[])// oldest person = smallest dob
{
int i;
int index=0
int oldest=1000000000;//dummy variable
for(i=1;i<1000;i++)//1000 is array length
{
if(array[i].dob<oldest)
{
index=i;
oldest=array[i].dob;
}
}
print_person(array[i]);
}


int main()
{
employees array[1000];
read_file(array);
find_oldest(array);
}

2 个答案:

答案 0 :(得分:2)

不清楚为什么函数被称为find_oldest。

尽管如此,您可以使用标准算法std::sort和比较函数,该函数可以是lambda表达式。例如

#include <iostream>

void find_oldest( employees array[], size_t n )
{
   std::sort( array, array + n, 
              []( const employees &e1, const employees &e2 )
              {
                 return ( e1.dob > e2.dob );
              } );  

   for ( size_t i = 0; i < n; i++ ) print_person( array[i] );
}

另一种方式是为结构员工或功能对象声明operator >而不是使用lambda表达式。 在我看来,最好定义一个功能对象。在这种情况下,对于任何类型的排序,例如通过名字或姓氏,您可以使用单独的功能对象。例如

struct employees // employee data
{
   int ss_number;//social security
   int dob;//date of birth YYYY/MM/DD Ex.) 19870314=1987/03/14
   string f_name;
   string l_name;
   string state; //state of residence 
   struct sort_by_dob
   {
      bool operator ()( const employees &e1, const employees &e2 ) const
      {
         return ( e1.dob > e2.dob );
      }
   };
};



void find_oldest( employees array[], size_t n )
{
   std::sort( array, array + n, employees::sort_by_dob() );  

   for ( size_t i = 0; i < n; i++ ) print_person( array[i] );
}

答案 1 :(得分:0)

编写自定义比较函数/函数/运算符并将其传递给std::sort()

bool operator<( const employees& lhs , const employees& rhs )
{
    return std::tie( lhs.f_name , lhs.l_name ) < std::tie( rhs.f_name , rhs.l_name );
}

int main()
{
    std::vector<employees> database; //Or an array, its the same.

    std::sort( std::begin( database ) , std::end( database ) );
}