Нахождение max_element вектора, где член используется, чтобы решить, является ли его максимум - PullRequest
6 голосов
/ 22 октября 2010

Рассмотрим класс A, имеющий член x и std :: vector . Теперь общая задача - найти максимальный х среди всех элементов внутри вектора. Ясно, что я могу использовать std :: max_element только в том случае, если на х есть итератор. Но я должен написать один самостоятельно, или я просто делаю простой цикл for.

maxSoFar = -std::numeric_limits< double >::max();
for( std::vector< A >::const_iterator cit = as.begin(); cit != as.end(); ++cit )
{
  if( cit->x > maxSoFar )
    maxSoFar = cit->x;
}

но это так утомительно, и мне так лень .. Есть ли лучший вариант?

Ответы [ 4 ]

24 голосов
/ 22 октября 2010

Вы можете передать компаратор в max_element. И если ваш компилятор поддерживает лямбды (это возможно), это просто:

std::max_element(as.begin(), as.end(),
    [](A a, A b){ return a.x < b.x; });
6 голосов
/ 22 октября 2010

Если вы можете использовать boost, то вы можете написать лямбда-выражение для двоичного предиката, ожидаемого max_element:

struct A
{
    A(int n): x(n)
    {
    }
    int x;
};

using namespace std;
using namespace boost::lambda;

int main()
{
    vector<A> as;
    as.push_back(A(7));
    as.push_back(A(5));
    as.push_back(A(3));

    vector<A>::iterator iter = max_element(as.begin(), as.end(), bind(&A::x, _2) > bind(&A::x, _1));
    int max = iter->x;
}
1 голос
/ 22 октября 2010

1) Измените 1-ую строку следующим образом:

maxSoFar = *(as.begin());

2) Реализуйте пользовательский компаратор и используйте max_element (как вы хотели): http://www.cplusplus.com/reference/algorithm/max_element/

0 голосов
/ 22 октября 2010

Реализация operator< в вашем классе, вызов:

maxSoFar =  *(std::max_element(as.begin(), as.end()));
...