Как извлечь самый большой объект, основанный на атрибуте, из вектора? - PullRequest
4 голосов
/ 31 октября 2010

Допустим, у меня есть набор Donut объектов, и у каждого из этих пончиков есть общедоступный целочисленный атрибут diameter.Если у меня есть вектор пончиков, как я могу извлечь пончик с наименьшим или наибольшим диаметром?

Ответы [ 3 ]

16 голосов
/ 31 октября 2010

Вы используете std::min_element и std::max_element. Например, с учетом std::vector<int>:

std::vector<int> v;
std::vector<int>::iterator it = std::max_element(v.begin(), v.end());
// 'it' points to the largest element in 'v'

Если вы хотите сравнить элементы, используя что-то отличное от operator< (которое используется по умолчанию), вам нужно написать собственный компаратор:

bool compare_donut_diameters(const Donut& x, const Donut& y)
{
    return x.diameter < y.diameter;
}

Используется как:

std::vector<Donut> v;
std::vector<Donut>::iterator it = std::max_element(v.begin, v.end(), 
                                                   compare_donut_diameters);

Вы также можете реализовать компаратор с помощью функционального объекта (также называемого функтором) или, если ваш компилятор поддерживает лямбда-выражения, вы можете использовать лямбду:

auto it = std::max_element(v.begin(), v.end(), 
    [](const Donut& x, const Donut& y) {  return x.diameter < y.diameter; });
1 голос
/ 31 октября 2010

Вы можете использовать алгоритм std :: max_element / std :: min_element в сочетании с оператором <, который сравнивает, используя атрибут диаметра или предоставленную пользователем функцию сравнения. </p>

http://www.cplusplus.com/reference/algorithm/max_element/
http://www.cplusplus.com/reference/algorithm/min_element/

1 голос
/ 31 октября 2010

Вы можете использовать std::min_element:

// You can use a functor instead!
bool compare_donut(const Donut& lhs, const Donut& rhs)
{ return lhs.diameter < rhs.diameter; }
...
// min_donut is an iterator to the smallest donut in donut_vector.
std::vector<Donut>::iterator min_donut = 
   std::min_element(donut_vector.begin(), donut_vector.end(), compare_donut);

Если вы хотите получить наибольшее, вы можете использовать std::max_element с тем же компаратором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...