Как найти максимальное значение второго элемента std :: pair в std :: vector? - PullRequest
2 голосов
/ 25 июня 2019

У меня есть вектор пар в этом порядке {{метка, вероятность}, {метка, вероятность}}. Я хочу получить пару, которая имеет максимальное значение вероятности. Вот моя попытка сделать это, но вместо того, чтобы получить максимальное значение вероятности, он возвращает максимальное значение строки метки. например метка собака является наибольшим значением из-за алфавитного порядка.

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main()
{
    std::vector<std::pair<std::string, float>> pairs;
    pairs = {{"apple",34.785}, {"banana",67.8467}, {"dog", 13.476}, {"cat",56.486}};

    const auto p = max_element(pairs.begin(), pairs.end());
    auto label = p->first;
    auto prob = p->second;

    std::cout<<label<<" "<<prob;
}

Выход: dog 13.476

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Вам необходимо предоставить настраиваемый компаратор для max_element, например,

max_element(pairs.begin(), 
            pairs.end(), 
            [](const auto& lhs, const auto& rhs) { return lhs.second < rhs.second; });

В противном случае std::max_element будет использовать operator< из std::pair в качестве компаратора, который проверит оба элемента std::pair.

Примечание: работает на C ++ 14 и выше

ЖИТЬ

1 голос
/ 25 июня 2019

Вы можете сделать это с помощью пользовательской функции компаратора.

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

bool compare(std::pair<std::string, float> p1, std::pair<std::string, float> p2) {
    return p1.second<p2.second;
}

int main()
{
    std::vector<std::pair<std::string, float>> pairs;
    pairs = {{"apple",34.785}, {"banana",67.8467}, {"dog", 13.476}, {"cat",56.486}};

    const auto p = max_element(pairs.begin(), pairs.end(), compare);
    auto label = p->first;
    auto prob = p->second;

    std::cout<<label<<" "<<prob;
}
...