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





Вам необходимо предоставить настраиваемый компаратор для 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 правка, она будет работать только на C++ 14 и выше.
Вы можете сделать это с помощью пользовательской функции компаратора.
#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;
}
Просто передайте лямбда сравнения в качестве третьего аргумента метода
max_element, т.е.:[](const auto &a, const auto &b) { return a.second < b.second; }