Как использовать std :: max с пользовательским компаратором в C ++ 11? - PullRequest
2 голосов
/ 28 сентября 2019

У меня есть вектор структур Хилла, и я хочу найти тот, который имеет самую высокую высоту.Вот мой код:

#include <vector>
#include <algorithm>
#include <assert.h>
struct Hill {
    int height;
    int changed;
};
int main() {
    std::vector<Hill> hills(100);
    hills[0].height = 100;
    hills[1].height = 150;
    auto byHeight = [&](const Hill& a, const Hill& b) {
        return a.height < b.height;
    };
    Hill hill = std::max(hills.begin(), hills.end(), byHeight);
    assert(hill.height == 150);
}

Но он не скомпилируется:

mcve.cpp:15:10: error: no viable conversion from 'const
      std::__1::__wrap_iter<Hill *>' to 'Hill'
    Hill hill = std::max(hills.begin(), hills.end(), byHeight);
         ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mcve.cpp:4:8: note: candidate constructor (the implicit copy constructor) not
      viable: no known conversion from 'const std::__1::__wrap_iter<Hill *>' to
      'const Hill &' for 1st argument
struct Hill {
       ^
mcve.cpp:4:8: note: candidate constructor (the implicit move constructor) not
      viable: no known conversion from 'const std::__1::__wrap_iter<Hill *>' to
      'Hill &&' for 1st argument
struct Hill {
       ^
In file included from mcve.cpp:1:
In file included from /Library/Developer/CommandLineTools/usr/include/c++/v1/vector:270:
In file included from /Library/Developer/CommandLineTools/usr/include/c++/v1/__bit_reference:15:
/Library/Developer/CommandLineTools/usr/include/c++/v1/algorithm:2627:12: error: 
      no matching function for call to object of type '(lambda at
      mcve.cpp:12:21)'
    return __comp(__a, __b) ? __b : __a;
           ^~~~~~
mcve.cpp:15:22: note: in instantiation of function template specialization
      'std::__1::max<std::__1::__wrap_iter<Hill *>, (lambda at mcve.cpp:12:21)>'
      requested here
    Hill hill = std::max(hills.begin(), hills.end(), byHeight);
                     ^
mcve.cpp:12:21: note: candidate function not viable: no known conversion from
      'const std::__1::__wrap_iter<Hill *>' to 'const Hill' for 1st argument
    auto byHeight = [&](const Hill& a, const Hill& b) {
                    ^
2 errors generated.

Как мне это исправить?

Ответы [ 2 ]

3 голосов
/ 28 сентября 2019

Изменение этих двух строк кода устранило проблему (благодаря @milleniumbug):

    auto hill = std::max_element(hills.begin(), hills.end(), byHeight);
    assert(hill->height == 150);

*std::max_element возвращает вам сам элемент.std::max_element возвращает итератор, давая вам возможность изменить элемент.

1 голос
/ 28 сентября 2019

Измените std::max на *std::max_element, и это будет работать.С *.

max_element() возвращает итератор, который * разыменовывается для получения фактического элемента.

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