无论对象变量类型如何,如何对对象数组进行排序
How Sort an array of objects regardless of object variable type
我有一个记录对象数组,每个记录对象有 5 个字段(名字、姓氏、GPA、身份证号码和电子邮件)。我想根据归因于对象的任何变量对数组进行排序。我的教授说有一种方法可以使用一个函数对其进行排序,而不管传递的变量类型如何。但是我想不出一种方法来让一个函数可以对这 5 个变量和 3 种不同的变量类型中的任何一个进行排序。这意味着我不能只为每个变量复制粘贴我的排序函数 5 次。到目前为止,我可以按单个值对数组进行排序,例如 record[].GPA,但我需要一种方法来实现 record[].x,其中 x 是用户决定数组排序依据的任何变量。
我尝试创建一个排序函数,它排序很好,但它一次只能处理一个变量比较。例如,我必须写 record[i].GPA 以便比较两条记录的 GPA。但是,我的老师想要它,以便函数可以根据任何字段进行排序。
template <class T>
void sortArray(T record[]) {
bool swap = true;
while (swap) {
swap = false;
for (size_t i = 0; i < arraySize - 1; i++) {
if (record[i].GPA< record[i + 1].GPA) {
T temp = record[i];
record[i] = record[i + 1];
record[i + 1] = temp;
swap = true;
}
}
}
}
这是我的排序代码,如您所见,我必须指出要排序的记录变量,在本例中为 GPA,但我需要它根据用户选择按任何记录变量排序。我不应该为每个变量设置多个排序函数。如果需要,我可以 post 我的其余代码。
你可以这样做:
auto makeComp = [](auto member){
return [=](const auto& lhs, const auto& rhs){
return std::invoke(member, lhs) < std::invoke(member, lhs);
}
};
switch (eMember)
{
case EMember::FirstName: std::sort(record, record + arraySize, makeComp(T::FirstName)); break;
case EMember::LastName: std::sort(record, record + arraySize, makeComp(T::LastName)); break;
case EMember::GPA: std::sort(record, record + arraySize, makeComp(T::GPA)); break;
case EMember::Id: std::sort(record, record + arraySize, makeComp(T::Id)); break;
case EMember::EMail: std::sort(record, record + arraySize, makeComp(T::Email)); break;
}
我有一个记录对象数组,每个记录对象有 5 个字段(名字、姓氏、GPA、身份证号码和电子邮件)。我想根据归因于对象的任何变量对数组进行排序。我的教授说有一种方法可以使用一个函数对其进行排序,而不管传递的变量类型如何。但是我想不出一种方法来让一个函数可以对这 5 个变量和 3 种不同的变量类型中的任何一个进行排序。这意味着我不能只为每个变量复制粘贴我的排序函数 5 次。到目前为止,我可以按单个值对数组进行排序,例如 record[].GPA,但我需要一种方法来实现 record[].x,其中 x 是用户决定数组排序依据的任何变量。
我尝试创建一个排序函数,它排序很好,但它一次只能处理一个变量比较。例如,我必须写 record[i].GPA 以便比较两条记录的 GPA。但是,我的老师想要它,以便函数可以根据任何字段进行排序。
template <class T>
void sortArray(T record[]) {
bool swap = true;
while (swap) {
swap = false;
for (size_t i = 0; i < arraySize - 1; i++) {
if (record[i].GPA< record[i + 1].GPA) {
T temp = record[i];
record[i] = record[i + 1];
record[i + 1] = temp;
swap = true;
}
}
}
}
这是我的排序代码,如您所见,我必须指出要排序的记录变量,在本例中为 GPA,但我需要它根据用户选择按任何记录变量排序。我不应该为每个变量设置多个排序函数。如果需要,我可以 post 我的其余代码。
你可以这样做:
auto makeComp = [](auto member){
return [=](const auto& lhs, const auto& rhs){
return std::invoke(member, lhs) < std::invoke(member, lhs);
}
};
switch (eMember)
{
case EMember::FirstName: std::sort(record, record + arraySize, makeComp(T::FirstName)); break;
case EMember::LastName: std::sort(record, record + arraySize, makeComp(T::LastName)); break;
case EMember::GPA: std::sort(record, record + arraySize, makeComp(T::GPA)); break;
case EMember::Id: std::sort(record, record + arraySize, makeComp(T::Id)); break;
case EMember::EMail: std::sort(record, record + arraySize, makeComp(T::Email)); break;
}