2015-04-19 1 views
2

Существует ли стандартный метод сортировки или фильтрации массива объектов на основе их элементов данных или функций-членов?Сортировка или фильтрация массивов объектов на основе элементов данных

Я ищу для стандартной функции, как 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; 
} 
+1

Функция ['std :: min_element()'] (http://en.cppreference.com/w/cpp/algorithm/min_element) предназначена для этого. –

+0

Вы хотите отсортировать, фильтровать или найти самое низкое значение? – juanchopanza

ответ

7

Для сортировки можно использовать 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>

+0

Я эта строка: 'inline bool operator <(const Grade & left, const Grade & right)' Я получаю ошибку: 'ошибка C2804: двоичный 'оператор <' имеет слишком много параметров – Pilpel

+0

@Pilpel Ваш оператор должен быть определен вне класса –

+0

Почему это? .... – Pilpel

0

"Is there a standard method of sorting or filtering an array of objects based on their data members or member functions?"

Существует ряд функций, доступных от c++ standard Algorithm library. А именно

реализовать функциональные возможности упомянутой (Примеры использования приведены в справочных страницах).

Вам необходимо предоставить соответствующие функции/классы компаратора, которые работают с вашими членами структуры. Это может быть даже лямбда-функции, если вы хотите записать их на лету.

1

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< в своем классе. Таким образом, вам не нужна функция сравнения.