【问题标题】:Sort or filter object arrays based on data members根据数据成员对对象数组进行排序或过滤
【发布时间】:2015-06-26 05:38:48
【问题描述】:

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

我在下面的代码中寻找像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::min_element() 函数就是为此而设计的。
  • 您要排序、过滤还是查找最小值?

标签: c++ sorting minimum


【解决方案1】:

您可以使用std::sort() 进行排序并找到最小值std::min_element()

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

operator&lt; 的示例

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 &lt;algorithm&gt;

【讨论】:

  • 我这一行:inline bool operator&lt; (const Grade&amp; left, const Grade&amp; right) 我得到错误:error C2804: binary 'operator &lt;' has too many parameters
  • @Pilpel 你的操作符应该在类之外定义
  • @Pilpel 可以在本文的“比较运算符”部分找到非常详细的回复:stackoverflow.com/questions/4421706/operator-overloading
【解决方案2】:

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

c++ standard Algorithm library 提供了许多功能。即

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

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

【讨论】:

    【解决方案3】:

    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&lt; 可能是个好主意。这样就不需要比较函数了。

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 2020-12-15
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 2019-03-28
      相关资源
      最近更新 更多