根据数据成员对对象数组进行排序或筛选

Sort or filter object arrays based on data members

本文关键字:排序 筛选 数组 数据成员 对象      更新时间:2023-10-16

是否有一种标准方法可以根据对象的数据成员或成员函数对对象数组进行排序或过滤?

我正在寻找一个标准函数,例如下面的代码中的getLowestValue

class Grade
{
public:
    Grade() : _grade(0) {}
    void setGrade(int i) { _grade = i; }
    int getGrade() const { return _grade; }
private:
    int _grade;
}
int main()
{
    Grade grades[10];
    for(int i = 0; i < 10; i++)
        grades[i].setGrade(generateRandomNumber());
    Grade *lowestGrade = getLowestValue(grades, Grade::getGrade); //???
    std::cout << "lowest grade: " << lowestGrade->getGrade() << std::endl;
    return 0;
}

要排序,您可以使用std::sort()并找到最小std::min_element()

在这两种情况下,您都必须实现operator<或创建比较函数。

operator<示例

inline bool operator< (const Grade& left, const Grade& right){ 
    return left.getGrade() < right.getGrade();
}

std::min_element()的用法 :

Grade result = *std::min_element(std::begin(grades), std::end(grades));

std::sort()的用法 :

std::sort(std::begin(grades), std::end(grades));

您必须包括:#include <algorithm>

http://en.cppreference.com/w/cpp/algorithm/sort

对任何内容进行排序的标准方法是将std::sort()与传递给它的比较函数一起使用。

std::sort(grades, grades + 10, [](Grade a, Grade b) {return a.getGrade() < b.getGrade();} );

如果对象之间的比较是你经常做的事情,那么在你的类中实现operator<可能是一个好主意。这样,您就不需要比较功能。

"是否有一种标准方法可以根据对象的数据成员或成员函数对对象数组进行排序或过滤?"

c++ 标准算法库中提供了许多函数。即

  • std::min_element
  • std::sort
  • std::remove_if
  • std::find_if

以实现您提到的功能(参考页面中给出了使用示例)。

您必须提供对结构成员进行操作的适当比较器函数/类。这些甚至可以是lambda函数,如果你想即时编写它们。